@fedify/fedify 2.4.0-dev.2071 → 2.4.0-dev.2073

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 (83) hide show
  1. package/dist/{builder-DVQ0yhKJ.mjs → builder-CVHpPAjK.mjs} +2 -2
  2. package/dist/compat/mod.d.cts +1 -1
  3. package/dist/compat/mod.d.ts +1 -1
  4. package/dist/compat/transformers.test.mjs +1 -1
  5. package/dist/{compound-proof-KmXDfWFp.mjs → compound-proof-B5Skp-vE.mjs} +1 -1
  6. package/dist/{context-DsB9kF6q.d.ts → context-BSywYspi.d.ts} +109 -1
  7. package/dist/{context-DijrgHDe.d.cts → context-CZjZYXFC.d.cts} +109 -1
  8. package/dist/{context-DG5QeQ8W.mjs → context-DlZhxdFT.mjs} +2 -1
  9. package/dist/{deno-B-NtYZVW.mjs → deno-LYTbBhYV.mjs} +1 -1
  10. package/dist/{docloader-C6yOVoaF.mjs → docloader-C0SWQylk.mjs} +2 -2
  11. package/dist/federation/builder.test.mjs +1 -1
  12. package/dist/federation/compound-fanout.test.mjs +3 -3
  13. package/dist/federation/handler-compound-proof.test.mjs +4 -4
  14. package/dist/federation/handler.test.mjs +6 -6
  15. package/dist/federation/hashlink-media.test.mjs +2 -2
  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 +8 -8
  19. package/dist/federation/mod.cjs +1 -1
  20. package/dist/federation/mod.d.cts +3 -3
  21. package/dist/federation/mod.d.ts +3 -3
  22. package/dist/federation/mod.js +1 -1
  23. package/dist/federation/outgoing-proof.test.mjs +5 -5
  24. package/dist/federation/portable-gateway-keys.test.mjs +4 -4
  25. package/dist/federation/portable-inbox.test.d.mts +2 -0
  26. package/dist/federation/portable-inbox.test.mjs +546 -0
  27. package/dist/federation/portable.test.mjs +3 -3
  28. package/dist/federation/send.test.mjs +3 -3
  29. package/dist/federation/tasks/enqueue.test.mjs +2 -2
  30. package/dist/federation/tasks/tasks.test.mjs +3 -3
  31. package/dist/federation/temporal.test.mjs +1 -1
  32. package/dist/federation/webfinger.test.mjs +2 -2
  33. package/dist/{federation-CUiHc7dP.cjs → federation-B1aeTKKN.cjs} +468 -88
  34. package/dist/{http-DKWi8RjI.mjs → http-C7qHlv-b.mjs} +4 -4
  35. package/dist/{http-CuLWIJdf.cjs → http-DGk8XI38.cjs} +1 -1
  36. package/dist/{http-BoWBwC0g.js → http-vfTpzGEq.js} +1 -1
  37. package/dist/{key-lfcx_NaE.mjs → key-BYXnTGro.mjs} +2 -2
  38. package/dist/{kv-cache-BdnmnAVc.js → kv-cache-DCJuwdnB.js} +1 -1
  39. package/dist/{kv-cache-d8EjO29d.mjs → kv-cache-DEH5jyND.mjs} +1 -1
  40. package/dist/{kv-cache-DE8kSNQU.cjs → kv-cache-DvqkKNIj.cjs} +1 -1
  41. package/dist/{ld-jyjdrWjG.mjs → ld-DT3e2hOv.mjs} +3 -3
  42. package/dist/{metrics-B5Rei-HC.mjs → metrics-DvlvYpq_.mjs} +1 -1
  43. package/dist/{middleware-CdVnCDXD.mjs → middleware-BJcez_E3.mjs} +1 -1
  44. package/dist/{middleware-CAObohey.js → middleware-CCbyUF4c.js} +417 -38
  45. package/dist/{middleware-CPx4ZWwt.mjs → middleware-CpyCNOW_.mjs} +423 -48
  46. package/dist/{mod-DMkflQdF.d.ts → mod-B2h2KY0q.d.ts} +1 -1
  47. package/dist/{mod-DTAaBwiY.d.cts → mod-JzkaEXsi.d.cts} +1 -1
  48. package/dist/mod.cjs +5 -5
  49. package/dist/mod.d.cts +4 -4
  50. package/dist/mod.d.ts +4 -4
  51. package/dist/mod.js +5 -5
  52. package/dist/nodeinfo/handler.test.mjs +2 -2
  53. package/dist/{owner-ByqNQVaa.mjs → owner-CDsVeZI7.mjs} +3 -3
  54. package/dist/{owner-BXufwAzm.cjs → owner-DCIH7Iq0.cjs} +1 -1
  55. package/dist/{owner-1TFakcTF.js → owner-DfGz0cXm.js} +1 -1
  56. package/dist/{portable-key-Cw_ow5vn.mjs → portable-key-DCyKGCQd.mjs} +2 -2
  57. package/dist/{proof-B6gwdhN5.mjs → proof-CxsVG6vM.mjs} +4 -4
  58. package/dist/{send-DsK7xevO.mjs → send-BZJ7NsVV.mjs} +8 -4
  59. package/dist/sig/compound-proof-discovery.test.mjs +1 -1
  60. package/dist/sig/compound-proof-producer.test.mjs +1 -1
  61. package/dist/sig/compound-proof-verification.test.mjs +2 -2
  62. package/dist/sig/compound-proof.test.mjs +2 -2
  63. package/dist/sig/http.test.mjs +2 -2
  64. package/dist/sig/key.test.mjs +1 -1
  65. package/dist/sig/ld.test.mjs +2 -2
  66. package/dist/sig/mod.cjs +3 -3
  67. package/dist/sig/mod.js +3 -3
  68. package/dist/sig/owner.test.mjs +1 -1
  69. package/dist/sig/portable-collection.test.mjs +2 -2
  70. package/dist/sig/portable-key.test.mjs +3 -3
  71. package/dist/sig/proof.test.mjs +3 -3
  72. package/dist/{sig-TTn9wYrE.cjs → sig-C6TnADze.cjs} +2 -2
  73. package/dist/{sig-BR_Z6mpY.js → sig-Cs9_ecdh.js} +2 -2
  74. package/dist/{temporal-Bw5jtrBY.mjs → temporal-CLzSfIOV.mjs} +1 -1
  75. package/dist/testing/kv.test.mjs +1 -1
  76. package/dist/testing/mod.d.mts +108 -0
  77. package/dist/testing/mod.mjs +2 -2
  78. package/dist/{testing-By1YYsIK.mjs → testing-CO_cEvQc.mjs} +1 -1
  79. package/dist/utils/docloader.test.mjs +2 -2
  80. package/dist/utils/kv-cache.test.mjs +1 -1
  81. package/dist/utils/mod.cjs +1 -1
  82. package/dist/utils/mod.js +1 -1
  83. package/package.json +6 -6
@@ -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-B-NtYZVW.mjs";
4
+ import { n as version, t as name } from "./deno-LYTbBhYV.mjs";
5
5
  import { t as ActivityListenerSet } from "./activity-listener-C-BSbKI7.mjs";
6
6
  import { getLogger } from "@logtape/logtape";
7
7
  import { Router, RouterError, assertPath } from "@fedify/uri-template";
@@ -86,7 +86,7 @@ var FederationBuilderImpl = class {
86
86
  * specified.
87
87
  */
88
88
  async build(options) {
89
- const { FederationImpl } = await import("./middleware-CdVnCDXD.mjs");
89
+ const { FederationImpl } = await import("./middleware-BJcez_E3.mjs");
90
90
  const f = new FederationImpl(options);
91
91
  const trailingSlashInsensitiveValue = f.router.trailingSlashInsensitive;
92
92
  f.router = this.router.clone();
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { Yt as ActivityTransformer, n as Context } from "../context-DijrgHDe.cjs";
2
+ import { Xt as ActivityTransformer, n as Context } from "../context-CZjZYXFC.cjs";
3
3
  import { Activity } from "@fedify/vocab";
4
4
 
5
5
  //#region src/compat/transformers.d.ts
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { Yt as ActivityTransformer, n as Context } from "../context-DsB9kF6q.js";
2
+ import { Xt as ActivityTransformer, n as Context } from "../context-BSywYspi.js";
3
3
  import { Activity } from "@fedify/vocab";
4
4
 
5
5
  //#region src/compat/transformers.d.ts
@@ -5,7 +5,7 @@ import { t as MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
6
6
  import { t as assertInstanceOf } from "../assert_instance_of-mrXWWNY-.mjs";
7
7
  import { t as assert } from "../assert-D1Eafmd_.mjs";
8
- import { S as autoIdAssigner, n as FederationImpl, x as actorDehydrator } from "../middleware-CPx4ZWwt.mjs";
8
+ import { C as actorDehydrator, n as FederationImpl, w as autoIdAssigner } from "../middleware-CpyCNOW_.mjs";
9
9
  import { Follow, Person } from "@fedify/vocab";
10
10
  import { test } from "@fedify/fixture";
11
11
  //#region src/compat/transformers.test.ts
@@ -1,7 +1,7 @@
1
1
  import "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { i as verifyMapLocalProof, s as verifyPortableObjectProofPolicy } from "./proof-B6gwdhN5.mjs";
4
+ import { i as verifyMapLocalProof, s as verifyPortableObjectProofPolicy } from "./proof-CxsVG6vM.mjs";
5
5
  //#region src/sig/compound-proof.ts
6
6
  const textEncoder = new TextEncoder();
7
7
  const PORTABLE_OBJECT_ID_PATTERN = /^ap(?:\+ef61)?:\/\//i;
@@ -1424,6 +1424,16 @@ interface FederationKvPrefixes {
1424
1424
  * @since 2.4.0
1425
1425
  */
1426
1426
  readonly taskDeduplication: KvKey;
1427
+ /**
1428
+ * The key prefix used for remembering which activities received in
1429
+ * [FEP-ef61] portable inboxes have been forwarded to which gateways, so that
1430
+ * each activity is forwarded at most once.
1431
+ *
1432
+ * [FEP-ef61]: https://w3id.org/fep/ef61
1433
+ * @default `["_fedify", "portableInboxForwarding"]`
1434
+ * @since 2.4.0
1435
+ */
1436
+ readonly portableInboxForwarding: KvKey;
1427
1437
  }
1428
1438
  /**
1429
1439
  * Options for {@link FederationOptions.origin} when it is not a string.
@@ -2030,6 +2040,44 @@ interface FederationBuilder<TContextData> extends Federatable<TContextData> {
2030
2040
  build(options: FederationOptions<TContextData>): Promise<Federation<TContextData>>;
2031
2041
  }
2032
2042
  /**
2043
+ * Options for forwarding activities received in [FEP-ef61] portable inboxes to
2044
+ * the other gateways of their actors. See
2045
+ * {@link FederationOptions.portableInboxForwarding}.
2046
+ *
2047
+ * [FEP-ef61]: https://w3id.org/fep/ef61
2048
+ * @since 2.4.0
2049
+ */
2050
+ interface PortableInboxForwardingOptions {
2051
+ /**
2052
+ * The maximum number of other gateways that a single delivery is forwarded
2053
+ * to. Gateways beyond it are skipped with a warning. `0` turns off
2054
+ * forwarding.
2055
+ * @default `10`
2056
+ */
2057
+ maxTargets?: number;
2058
+ /**
2059
+ * How long Fedify remembers that it has forwarded an activity from
2060
+ * a portable inbox to a gateway, under
2061
+ * {@link FederationKvPrefixes.portableInboxForwarding}. Within it, the same
2062
+ * activity is never forwarded to the same gateway again; once it expires,
2063
+ * a redelivery of the activity may be forwarded again. It cannot have
2064
+ * calendar units, i.e., weeks, months, or years.
2065
+ * @default `{ days: 30 }`
2066
+ */
2067
+ ttl?: Temporal.DurationLike;
2068
+ /**
2069
+ * How long a delivery waits for forwarding requests made immediately, i.e.,
2070
+ * when no outbox queue is configured, before Fedify responds to it.
2071
+ * Requests still running afterwards continue in the background. It does
2072
+ * not apply when forwarding is queued. It cannot have calendar units,
2073
+ * i.e., weeks, months, or years, and cannot be longer than
2074
+ * 2,147,483,647 milliseconds (about 24.8 days), the longest delay timers
2075
+ * support.
2076
+ * @default `{ seconds: 10 }`
2077
+ */
2078
+ deadline?: Temporal.DurationLike;
2079
+ }
2080
+ /**
2033
2081
  * Policy for emitting `Accept-Signature` challenges on inbox `401`
2034
2082
  * responses, as defined in
2035
2083
  * [RFC 9421 §5](https://www.rfc-editor.org/rfc/rfc9421#section-5).
@@ -2124,6 +2172,14 @@ interface FederationOptions<TContextData> {
2124
2172
  */
2125
2173
  httpMessageSignaturesSpecTtl?: Temporal.DurationLike;
2126
2174
  /**
2175
+ * Options for forwarding activities received in [FEP-ef61] portable inboxes
2176
+ * to the other gateways of their actors.
2177
+ *
2178
+ * [FEP-ef61]: https://w3id.org/fep/ef61
2179
+ * @since 2.4.0
2180
+ */
2181
+ portableInboxForwarding?: PortableInboxForwardingOptions;
2182
+ /**
2127
2183
  * The message queue for sending and receiving activities. If not provided,
2128
2184
  * activities will not be queued and will be processed immediately.
2129
2185
  *
@@ -2907,6 +2963,35 @@ interface Context<TContextData> {
2907
2963
  */
2908
2964
  getPortableObjectUri<TObject extends Object$1>(cls: ConstructorWithTypeId<TObject>, values: Record<string, string>, authority: string): URL;
2909
2965
  /**
2966
+ * Builds the [FEP-ef61] portable ID of an actor's inbox with the given
2967
+ * identifier under the given DID authority.
2968
+ *
2969
+ * The path is the same as the one {@link Context.getInboxUri} builds from
2970
+ * the inbox path, but the result is an `ap+ef61:` URI whose authority is
2971
+ * the DID, e.g., `ap+ef61://did:key:z6Mk.../users/alice/inbox`. If
2972
+ * a portable actor has it as its `inbox` and lists this server in its
2973
+ * `gateways`, this server accepts deliveries to the inbox through
2974
+ * the FEP-ef61 gateway endpoint, e.g.,
2975
+ * `POST /.well-known/apgateway/did:key:z6Mk.../users/alice/inbox`, and
2976
+ * dispatches them to the inbox listeners.
2977
+ *
2978
+ * The returned `URL` keeps the DID authority percent-encoded, because
2979
+ * the `URL` class cannot represent the canonical form. Use `formatIri()`
2980
+ * from `@fedify/vocab-runtime` to get the canonical string.
2981
+ *
2982
+ * [FEP-ef61]: https://w3id.org/fep/ef61
2983
+ *
2984
+ * @param identifier The actor's identifier.
2985
+ * @param authority The DID that controls the actor, e.g.,
2986
+ * `did:key:z6Mk...`. It must be a bare DID, without
2987
+ * a path, query, or fragment.
2988
+ * @returns The inbox's portable ID.
2989
+ * @throws {RouterError} If no inbox path is registered.
2990
+ * @throws {TypeError} If the authority is not a DID.
2991
+ * @since 2.4.0
2992
+ */
2993
+ getPortableInboxUri(identifier: string, authority: string): URL;
2994
+ /**
2910
2995
  * Builds the URI of an actor's outbox with the given identifier.
2911
2996
  * @param identifier The actor's identifier.
2912
2997
  * @returns The actor's outbox URI.
@@ -3321,6 +3406,29 @@ interface RequestContext<TContextData> extends Context<TContextData> {
3321
3406
  */
3322
3407
  getPortableObjectUri<TObject extends Object$1>(cls: ConstructorWithTypeId<TObject>, values: Record<string, string>, authority?: string): URL;
3323
3408
  /**
3409
+ * Builds the [FEP-ef61] portable ID of an actor's inbox with the given
3410
+ * identifier. It works the same as {@link Context.getPortableInboxUri},
3411
+ * except that the authority can be omitted while handling a portable object
3412
+ * request, i.e., when {@link RequestContext.portableRequest} is set. In
3413
+ * that case, its DID is used. Deliveries to portable inboxes do not set
3414
+ * {@link RequestContext.portableRequest}, so pass the authority explicitly
3415
+ * while handling them.
3416
+ *
3417
+ * [FEP-ef61]: https://w3id.org/fep/ef61
3418
+ *
3419
+ * @param identifier The actor's identifier.
3420
+ * @param authority The DID that controls the actor, e.g.,
3421
+ * `did:key:z6Mk...`. It must be a bare DID, without
3422
+ * a path, query, or fragment. Defaults to the DID of
3423
+ * the requested portable object, if any.
3424
+ * @returns The inbox's portable ID.
3425
+ * @throws {RouterError} If no inbox path is registered.
3426
+ * @throws {TypeError} If the authority is not a DID, or the authority is
3427
+ * omitted outside a portable gateway request.
3428
+ * @since 2.4.0
3429
+ */
3430
+ getPortableInboxUri(identifier: string, authority?: string): URL;
3431
+ /**
3324
3432
  * Creates a new context with the same properties as this one,
3325
3433
  * but with the given data.
3326
3434
  * @param data The new data to associate with the context.
@@ -3795,4 +3903,4 @@ interface ActorKeyPair extends CryptoKeyPair {
3795
3903
  readonly multikey: Multikey;
3796
3904
  }
3797
3905
  //#endregion
3798
- export { MessageQueue as $, ObjectCallbackSetters as A, InboxListener as At, TaskDefinitionOptions as B, SharedInboxKeyDispatcher as Bt, FederationOptions as C, CollectionDispatcher as Ct, InboxChallengePolicy as D, HashlinkMediaDispatcher as Dt, IdempotencyStrategy as E, CustomCollectionDispatcher as Et, FederationQueueOptions as F, OutboxErrorHandler as Ft, RetryContext as G, SenderKeyPair as Gt, TaskHandler as H, UnverifiedActivityReason as Ht, createFederation as I, OutboxListener as It, RespondWithObjectOptions as J, digest as Jt, RetryPolicy as K, PageItems as Kt, Message as L, OutboxListenerErrorHandler as Lt, Rfc6570Expression as M, NodeInfoDispatcher as Mt, FederationKvPrefixes as N, ObjectAuthorizePredicate as Nt, InboxListenerSetters as O, HashlinkMediaRequest as Ot, FederationOrigin as P, ObjectDispatcher as Pt, InProcessMessageQueueOptions as Q, createFederationBuilder as R, OutboxPermanentFailureHandler as Rt, FederationFetchOptions as S, CollectionCursor as St, IdempotencyKeyCallback as T, CustomCollectionCursor as Tt, TaskRegistry as U, WebFingerLinksDispatcher as Ut, TaskEnqueueOptions as V, UnverifiedActivityHandler as Vt, CreateExponentialBackoffPolicyOptions as W, SendActivityError as Wt, respondWithObjectIfAcceptable as X, respondWithObject as Y, ActivityTransformer as Yt, InProcessMessageQueue as Z, CustomCollectionCallbackSetters as _, ActorDispatcher as _t, GetSignedKeyOptions as a, CircuitBreakerActivityDrop as at, FederationBenchmarkOptions as b, AuthorizePredicate as bt, ParseUriResult as c, CircuitBreakerFailurePolicy as ct, RouteActivityOptions as d, CircuitBreakerState as dt, MessageQueueDepth as et, SendActivityOptions as f, CircuitBreakerStateChange as ft, ConstructorWithTypeId as g, ActorAliasMapper as gt, CollectionCallbackSetters as h, parseCircuitBreakerKvState as ht, GetActorOptions as i, CircuitBreaker as it, OutboxListenerSetters as j, MediaUploaderCallback as jt, MediaUploaderSetters as k, InboxErrorHandler as kt, PortableRequest as l, CircuitBreakerKvState as lt, ActorCallbackSetters as m, normalizeCircuitBreakerOptions as mt, Context as n, MessageQueueListenOptions as nt, InboxContext as o, CircuitBreakerBeforeSendDecision as ot, SendActivityOptionsForCollection as p, NormalizedCircuitBreakerOptions as pt, createExponentialBackoffPolicy as q, buildCollectionSynchronizationHeader as qt, ForwardActivityOptions as r, ParallelMessageQueue as rt, OutboxContext as s, CircuitBreakerCreateOptions as st, ActorKeyPair as t, MessageQueueEnqueueOptions as tt, RequestContext as u, CircuitBreakerOptions as ut, Federatable as v, ActorHandleMapper as vt, FederationStartQueueOptions as w, CustomCollectionCounter as wt, FederationBuilder as x, CollectionCounter as xt, Federation as y, ActorKeyPairsDispatcher as yt, TaskDefinition as z, PortableActorIdMapper as zt };
3906
+ export { InProcessMessageQueueOptions as $, ObjectCallbackSetters as A, InboxErrorHandler as At, TaskDefinition as B, PortableActorIdMapper as Bt, FederationOptions as C, CollectionCursor as Ct, InboxChallengePolicy as D, CustomCollectionDispatcher as Dt, IdempotencyStrategy as E, CustomCollectionCursor as Et, FederationOrigin as F, ObjectDispatcher as Ft, CreateExponentialBackoffPolicyOptions as G, SendActivityError as Gt, TaskEnqueueOptions as H, UnverifiedActivityHandler as Ht, FederationQueueOptions as I, OutboxErrorHandler as It, createExponentialBackoffPolicy as J, buildCollectionSynchronizationHeader as Jt, RetryContext as K, SenderKeyPair as Kt, createFederation as L, OutboxListener as Lt, PortableInboxForwardingOptions as M, MediaUploaderCallback as Mt, Rfc6570Expression as N, NodeInfoDispatcher as Nt, InboxListenerSetters as O, HashlinkMediaDispatcher as Ot, FederationKvPrefixes as P, ObjectAuthorizePredicate as Pt, InProcessMessageQueue as Q, Message as R, OutboxListenerErrorHandler as Rt, FederationFetchOptions as S, CollectionCounter as St, IdempotencyKeyCallback as T, CustomCollectionCounter as Tt, TaskHandler as U, UnverifiedActivityReason as Ut, TaskDefinitionOptions as V, SharedInboxKeyDispatcher as Vt, TaskRegistry as W, WebFingerLinksDispatcher as Wt, respondWithObject as X, ActivityTransformer as Xt, RespondWithObjectOptions as Y, digest as Yt, respondWithObjectIfAcceptable as Z, CustomCollectionCallbackSetters as _, ActorAliasMapper as _t, GetSignedKeyOptions as a, CircuitBreaker as at, FederationBenchmarkOptions as b, ActorKeyPairsDispatcher as bt, ParseUriResult as c, CircuitBreakerCreateOptions as ct, RouteActivityOptions as d, CircuitBreakerOptions as dt, MessageQueue as et, SendActivityOptions as f, CircuitBreakerState as ft, ConstructorWithTypeId as g, parseCircuitBreakerKvState as gt, CollectionCallbackSetters as h, normalizeCircuitBreakerOptions as ht, GetActorOptions as i, ParallelMessageQueue as it, OutboxListenerSetters as j, InboxListener as jt, MediaUploaderSetters as k, HashlinkMediaRequest as kt, PortableRequest as l, CircuitBreakerFailurePolicy as lt, ActorCallbackSetters as m, NormalizedCircuitBreakerOptions as mt, Context as n, MessageQueueEnqueueOptions as nt, InboxContext as o, CircuitBreakerActivityDrop as ot, SendActivityOptionsForCollection as p, CircuitBreakerStateChange as pt, RetryPolicy as q, PageItems as qt, ForwardActivityOptions as r, MessageQueueListenOptions as rt, OutboxContext as s, CircuitBreakerBeforeSendDecision as st, ActorKeyPair as t, MessageQueueDepth as tt, RequestContext as u, CircuitBreakerKvState as ut, Federatable as v, ActorDispatcher as vt, FederationStartQueueOptions as w, CollectionDispatcher as wt, FederationBuilder as x, AuthorizePredicate as xt, Federation as y, ActorHandleMapper as yt, createFederationBuilder as z, OutboxPermanentFailureHandler as zt };
@@ -1422,6 +1422,16 @@ interface FederationKvPrefixes {
1422
1422
  * @since 2.4.0
1423
1423
  */
1424
1424
  readonly taskDeduplication: KvKey;
1425
+ /**
1426
+ * The key prefix used for remembering which activities received in
1427
+ * [FEP-ef61] portable inboxes have been forwarded to which gateways, so that
1428
+ * each activity is forwarded at most once.
1429
+ *
1430
+ * [FEP-ef61]: https://w3id.org/fep/ef61
1431
+ * @default `["_fedify", "portableInboxForwarding"]`
1432
+ * @since 2.4.0
1433
+ */
1434
+ readonly portableInboxForwarding: KvKey;
1425
1435
  }
1426
1436
  /**
1427
1437
  * Options for {@link FederationOptions.origin} when it is not a string.
@@ -2028,6 +2038,44 @@ interface FederationBuilder<TContextData> extends Federatable<TContextData> {
2028
2038
  build(options: FederationOptions<TContextData>): Promise<Federation<TContextData>>;
2029
2039
  }
2030
2040
  /**
2041
+ * Options for forwarding activities received in [FEP-ef61] portable inboxes to
2042
+ * the other gateways of their actors. See
2043
+ * {@link FederationOptions.portableInboxForwarding}.
2044
+ *
2045
+ * [FEP-ef61]: https://w3id.org/fep/ef61
2046
+ * @since 2.4.0
2047
+ */
2048
+ interface PortableInboxForwardingOptions {
2049
+ /**
2050
+ * The maximum number of other gateways that a single delivery is forwarded
2051
+ * to. Gateways beyond it are skipped with a warning. `0` turns off
2052
+ * forwarding.
2053
+ * @default `10`
2054
+ */
2055
+ maxTargets?: number;
2056
+ /**
2057
+ * How long Fedify remembers that it has forwarded an activity from
2058
+ * a portable inbox to a gateway, under
2059
+ * {@link FederationKvPrefixes.portableInboxForwarding}. Within it, the same
2060
+ * activity is never forwarded to the same gateway again; once it expires,
2061
+ * a redelivery of the activity may be forwarded again. It cannot have
2062
+ * calendar units, i.e., weeks, months, or years.
2063
+ * @default `{ days: 30 }`
2064
+ */
2065
+ ttl?: Temporal.DurationLike;
2066
+ /**
2067
+ * How long a delivery waits for forwarding requests made immediately, i.e.,
2068
+ * when no outbox queue is configured, before Fedify responds to it.
2069
+ * Requests still running afterwards continue in the background. It does
2070
+ * not apply when forwarding is queued. It cannot have calendar units,
2071
+ * i.e., weeks, months, or years, and cannot be longer than
2072
+ * 2,147,483,647 milliseconds (about 24.8 days), the longest delay timers
2073
+ * support.
2074
+ * @default `{ seconds: 10 }`
2075
+ */
2076
+ deadline?: Temporal.DurationLike;
2077
+ }
2078
+ /**
2031
2079
  * Policy for emitting `Accept-Signature` challenges on inbox `401`
2032
2080
  * responses, as defined in
2033
2081
  * [RFC 9421 §5](https://www.rfc-editor.org/rfc/rfc9421#section-5).
@@ -2122,6 +2170,14 @@ interface FederationOptions<TContextData> {
2122
2170
  */
2123
2171
  httpMessageSignaturesSpecTtl?: Temporal.DurationLike;
2124
2172
  /**
2173
+ * Options for forwarding activities received in [FEP-ef61] portable inboxes
2174
+ * to the other gateways of their actors.
2175
+ *
2176
+ * [FEP-ef61]: https://w3id.org/fep/ef61
2177
+ * @since 2.4.0
2178
+ */
2179
+ portableInboxForwarding?: PortableInboxForwardingOptions;
2180
+ /**
2125
2181
  * The message queue for sending and receiving activities. If not provided,
2126
2182
  * activities will not be queued and will be processed immediately.
2127
2183
  *
@@ -2905,6 +2961,35 @@ interface Context<TContextData> {
2905
2961
  */
2906
2962
  getPortableObjectUri<TObject extends Object$1>(cls: ConstructorWithTypeId<TObject>, values: Record<string, string>, authority: string): URL;
2907
2963
  /**
2964
+ * Builds the [FEP-ef61] portable ID of an actor's inbox with the given
2965
+ * identifier under the given DID authority.
2966
+ *
2967
+ * The path is the same as the one {@link Context.getInboxUri} builds from
2968
+ * the inbox path, but the result is an `ap+ef61:` URI whose authority is
2969
+ * the DID, e.g., `ap+ef61://did:key:z6Mk.../users/alice/inbox`. If
2970
+ * a portable actor has it as its `inbox` and lists this server in its
2971
+ * `gateways`, this server accepts deliveries to the inbox through
2972
+ * the FEP-ef61 gateway endpoint, e.g.,
2973
+ * `POST /.well-known/apgateway/did:key:z6Mk.../users/alice/inbox`, and
2974
+ * dispatches them to the inbox listeners.
2975
+ *
2976
+ * The returned `URL` keeps the DID authority percent-encoded, because
2977
+ * the `URL` class cannot represent the canonical form. Use `formatIri()`
2978
+ * from `@fedify/vocab-runtime` to get the canonical string.
2979
+ *
2980
+ * [FEP-ef61]: https://w3id.org/fep/ef61
2981
+ *
2982
+ * @param identifier The actor's identifier.
2983
+ * @param authority The DID that controls the actor, e.g.,
2984
+ * `did:key:z6Mk...`. It must be a bare DID, without
2985
+ * a path, query, or fragment.
2986
+ * @returns The inbox's portable ID.
2987
+ * @throws {RouterError} If no inbox path is registered.
2988
+ * @throws {TypeError} If the authority is not a DID.
2989
+ * @since 2.4.0
2990
+ */
2991
+ getPortableInboxUri(identifier: string, authority: string): URL;
2992
+ /**
2908
2993
  * Builds the URI of an actor's outbox with the given identifier.
2909
2994
  * @param identifier The actor's identifier.
2910
2995
  * @returns The actor's outbox URI.
@@ -3319,6 +3404,29 @@ interface RequestContext<TContextData> extends Context<TContextData> {
3319
3404
  */
3320
3405
  getPortableObjectUri<TObject extends Object$1>(cls: ConstructorWithTypeId<TObject>, values: Record<string, string>, authority?: string): URL;
3321
3406
  /**
3407
+ * Builds the [FEP-ef61] portable ID of an actor's inbox with the given
3408
+ * identifier. It works the same as {@link Context.getPortableInboxUri},
3409
+ * except that the authority can be omitted while handling a portable object
3410
+ * request, i.e., when {@link RequestContext.portableRequest} is set. In
3411
+ * that case, its DID is used. Deliveries to portable inboxes do not set
3412
+ * {@link RequestContext.portableRequest}, so pass the authority explicitly
3413
+ * while handling them.
3414
+ *
3415
+ * [FEP-ef61]: https://w3id.org/fep/ef61
3416
+ *
3417
+ * @param identifier The actor's identifier.
3418
+ * @param authority The DID that controls the actor, e.g.,
3419
+ * `did:key:z6Mk...`. It must be a bare DID, without
3420
+ * a path, query, or fragment. Defaults to the DID of
3421
+ * the requested portable object, if any.
3422
+ * @returns The inbox's portable ID.
3423
+ * @throws {RouterError} If no inbox path is registered.
3424
+ * @throws {TypeError} If the authority is not a DID, or the authority is
3425
+ * omitted outside a portable gateway request.
3426
+ * @since 2.4.0
3427
+ */
3428
+ getPortableInboxUri(identifier: string, authority?: string): URL;
3429
+ /**
3322
3430
  * Creates a new context with the same properties as this one,
3323
3431
  * but with the given data.
3324
3432
  * @param data The new data to associate with the context.
@@ -3793,4 +3901,4 @@ interface ActorKeyPair extends CryptoKeyPair {
3793
3901
  readonly multikey: Multikey;
3794
3902
  }
3795
3903
  //#endregion
3796
- export { MessageQueue as $, ObjectCallbackSetters as A, InboxListener as At, TaskDefinitionOptions as B, SharedInboxKeyDispatcher as Bt, FederationOptions as C, CollectionDispatcher as Ct, InboxChallengePolicy as D, HashlinkMediaDispatcher as Dt, IdempotencyStrategy as E, CustomCollectionDispatcher as Et, FederationQueueOptions as F, OutboxErrorHandler as Ft, RetryContext as G, SenderKeyPair as Gt, TaskHandler as H, UnverifiedActivityReason as Ht, createFederation as I, OutboxListener as It, RespondWithObjectOptions as J, digest as Jt, RetryPolicy as K, PageItems as Kt, Message as L, OutboxListenerErrorHandler as Lt, Rfc6570Expression as M, NodeInfoDispatcher as Mt, FederationKvPrefixes as N, ObjectAuthorizePredicate as Nt, InboxListenerSetters as O, HashlinkMediaRequest as Ot, FederationOrigin as P, ObjectDispatcher as Pt, InProcessMessageQueueOptions as Q, createFederationBuilder as R, OutboxPermanentFailureHandler as Rt, FederationFetchOptions as S, CollectionCursor as St, IdempotencyKeyCallback as T, CustomCollectionCursor as Tt, TaskRegistry as U, WebFingerLinksDispatcher as Ut, TaskEnqueueOptions as V, UnverifiedActivityHandler as Vt, CreateExponentialBackoffPolicyOptions as W, SendActivityError as Wt, respondWithObjectIfAcceptable as X, respondWithObject as Y, ActivityTransformer as Yt, InProcessMessageQueue as Z, CustomCollectionCallbackSetters as _, ActorDispatcher as _t, GetSignedKeyOptions as a, CircuitBreakerActivityDrop as at, FederationBenchmarkOptions as b, AuthorizePredicate as bt, ParseUriResult as c, CircuitBreakerFailurePolicy as ct, RouteActivityOptions as d, CircuitBreakerState as dt, MessageQueueDepth as et, SendActivityOptions as f, CircuitBreakerStateChange as ft, ConstructorWithTypeId as g, ActorAliasMapper as gt, CollectionCallbackSetters as h, parseCircuitBreakerKvState as ht, GetActorOptions as i, CircuitBreaker as it, OutboxListenerSetters as j, MediaUploaderCallback as jt, MediaUploaderSetters as k, InboxErrorHandler as kt, PortableRequest as l, CircuitBreakerKvState as lt, ActorCallbackSetters as m, normalizeCircuitBreakerOptions as mt, Context as n, MessageQueueListenOptions as nt, InboxContext as o, CircuitBreakerBeforeSendDecision as ot, SendActivityOptionsForCollection as p, NormalizedCircuitBreakerOptions as pt, createExponentialBackoffPolicy as q, buildCollectionSynchronizationHeader as qt, ForwardActivityOptions as r, ParallelMessageQueue as rt, OutboxContext as s, CircuitBreakerCreateOptions as st, ActorKeyPair as t, MessageQueueEnqueueOptions as tt, RequestContext as u, CircuitBreakerOptions as ut, Federatable as v, ActorHandleMapper as vt, FederationStartQueueOptions as w, CustomCollectionCounter as wt, FederationBuilder as x, CollectionCounter as xt, Federation as y, ActorKeyPairsDispatcher as yt, TaskDefinition as z, PortableActorIdMapper as zt };
3904
+ export { InProcessMessageQueueOptions as $, ObjectCallbackSetters as A, InboxErrorHandler as At, TaskDefinition as B, PortableActorIdMapper as Bt, FederationOptions as C, CollectionCursor as Ct, InboxChallengePolicy as D, CustomCollectionDispatcher as Dt, IdempotencyStrategy as E, CustomCollectionCursor as Et, FederationOrigin as F, ObjectDispatcher as Ft, CreateExponentialBackoffPolicyOptions as G, SendActivityError as Gt, TaskEnqueueOptions as H, UnverifiedActivityHandler as Ht, FederationQueueOptions as I, OutboxErrorHandler as It, createExponentialBackoffPolicy as J, buildCollectionSynchronizationHeader as Jt, RetryContext as K, SenderKeyPair as Kt, createFederation as L, OutboxListener as Lt, PortableInboxForwardingOptions as M, MediaUploaderCallback as Mt, Rfc6570Expression as N, NodeInfoDispatcher as Nt, InboxListenerSetters as O, HashlinkMediaDispatcher as Ot, FederationKvPrefixes as P, ObjectAuthorizePredicate as Pt, InProcessMessageQueue as Q, Message as R, OutboxListenerErrorHandler as Rt, FederationFetchOptions as S, CollectionCounter as St, IdempotencyKeyCallback as T, CustomCollectionCounter as Tt, TaskHandler as U, UnverifiedActivityReason as Ut, TaskDefinitionOptions as V, SharedInboxKeyDispatcher as Vt, TaskRegistry as W, WebFingerLinksDispatcher as Wt, respondWithObject as X, ActivityTransformer as Xt, RespondWithObjectOptions as Y, digest as Yt, respondWithObjectIfAcceptable as Z, CustomCollectionCallbackSetters as _, ActorAliasMapper as _t, GetSignedKeyOptions as a, CircuitBreaker as at, FederationBenchmarkOptions as b, ActorKeyPairsDispatcher as bt, ParseUriResult as c, CircuitBreakerCreateOptions as ct, RouteActivityOptions as d, CircuitBreakerOptions as dt, MessageQueue as et, SendActivityOptions as f, CircuitBreakerState as ft, ConstructorWithTypeId as g, parseCircuitBreakerKvState as gt, CollectionCallbackSetters as h, normalizeCircuitBreakerOptions as ht, GetActorOptions as i, ParallelMessageQueue as it, OutboxListenerSetters as j, InboxListener as jt, MediaUploaderSetters as k, HashlinkMediaRequest as kt, PortableRequest as l, CircuitBreakerFailurePolicy as lt, ActorCallbackSetters as m, NormalizedCircuitBreakerOptions as mt, Context as n, MessageQueueEnqueueOptions as nt, InboxContext as o, CircuitBreakerActivityDrop as ot, SendActivityOptionsForCollection as p, CircuitBreakerStateChange as pt, RetryPolicy as q, PageItems as qt, ForwardActivityOptions as r, MessageQueueListenOptions as rt, OutboxContext as s, CircuitBreakerBeforeSendDecision as st, ActorKeyPair as t, MessageQueueDepth as tt, RequestContext as u, CircuitBreakerKvState as ut, Federatable as v, ActorDispatcher as vt, FederationStartQueueOptions as w, CollectionDispatcher as wt, FederationBuilder as x, AuthorizePredicate as xt, Federation as y, ActorHandleMapper as yt, createFederationBuilder as z, OutboxPermanentFailureHandler as zt };
@@ -8,7 +8,7 @@ import { lookupWebFinger } from "@fedify/webfinger";
8
8
  import { metrics, trace } from "@opentelemetry/api";
9
9
  //#region src/testing/context.ts
10
10
  function createContext(values) {
11
- const { federation, url = new URL("http://example.com/"), canonicalOrigin, data, documentLoader, contextLoader, meterProvider, tracerProvider, clone, getNodeInfoUri, getActorUri, getObjectUri, getPortableObjectUri, getCollectionUri, getOutboxUri, getMediaUploaderUri, getInboxUri, getFollowingUri, getFollowersUri, getLikedUri, getFeaturedUri, getFeaturedTagsUri, parseUri, getActorKeyPairs, getDocumentLoader, lookupObject: lookupObject$1, traverseCollection: traverseCollection$1, lookupNodeInfo, lookupWebFinger: lookupWebFinger$1, sendActivity, routeActivity, enqueueTask, enqueueTaskMany } = values;
11
+ const { federation, url = new URL("http://example.com/"), canonicalOrigin, data, documentLoader, contextLoader, meterProvider, tracerProvider, clone, getNodeInfoUri, getActorUri, getObjectUri, getPortableObjectUri, getPortableInboxUri, getCollectionUri, getOutboxUri, getMediaUploaderUri, getInboxUri, getFollowingUri, getFollowersUri, getLikedUri, getFeaturedUri, getFeaturedTagsUri, parseUri, getActorKeyPairs, getDocumentLoader, lookupObject: lookupObject$1, traverseCollection: traverseCollection$1, lookupNodeInfo, lookupWebFinger: lookupWebFinger$1, sendActivity, routeActivity, enqueueTask, enqueueTaskMany } = values;
12
12
  function throwRouterError() {
13
13
  throw new RouterError("Not implemented");
14
14
  }
@@ -31,6 +31,7 @@ function createContext(values) {
31
31
  getActorUri: getActorUri ?? throwRouterError,
32
32
  getObjectUri: getObjectUri ?? throwRouterError,
33
33
  getPortableObjectUri: getPortableObjectUri ?? throwRouterError,
34
+ getPortableInboxUri: getPortableInboxUri ?? throwRouterError,
34
35
  getCollectionUri: getCollectionUri ?? throwRouterError,
35
36
  getOutboxUri: getOutboxUri ?? throwRouterError,
36
37
  getMediaUploaderUri: getMediaUploaderUri ?? throwRouterError,
@@ -3,6 +3,6 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  //#region deno.json
5
5
  var name = "@fedify/fedify";
6
- var version = "2.4.0-dev.2071+8b9dccb9";
6
+ var version = "2.4.0-dev.2073+2152dfc6";
7
7
  //#endregion
8
8
  export { version as n, name as t };
@@ -1,8 +1,8 @@
1
1
  import "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { s as validateCryptoKey } from "./key-lfcx_NaE.mjs";
5
- import { n as doubleKnock } from "./http-DKWi8RjI.mjs";
4
+ import { s as validateCryptoKey } from "./key-BYXnTGro.mjs";
5
+ import { n as doubleKnock } from "./http-C7qHlv-b.mjs";
6
6
  import { getLogger } from "@logtape/logtape";
7
7
  import { curry } from "es-toolkit";
8
8
  import { UrlError, createActivityPubRequest, getRemoteDocument, logRequest, validatePublicUrl } from "@fedify/vocab-runtime";
@@ -6,7 +6,7 @@ import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
6
6
  import { t as assertExists } from "../assert_exists-cffSpJ7X.mjs";
7
7
  import { t as assertThrows } from "../assert_throws-BYITOvPO.mjs";
8
8
  import "../std__assert-DvMDRPes.mjs";
9
- import { r as createFederationBuilder } from "../builder-DVQ0yhKJ.mjs";
9
+ import { r as createFederationBuilder } from "../builder-CVHpPAjK.mjs";
10
10
  import { DisallowedOperatorError, DisallowedVarSpecModifierError, DuplicateRouteVariableError, RouteTemplateOptionsNotMatchedError, RouterError } from "@fedify/uri-template";
11
11
  import { Activity, Note, Person } from "@fedify/vocab";
12
12
  import { test } from "@fedify/fixture";
@@ -6,11 +6,11 @@ import { t as MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
6
6
  import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
7
7
  import "../std__assert-DvMDRPes.mjs";
8
8
  import { t as assert } from "../assert-D1Eafmd_.mjs";
9
- import { t as exportJwk } from "../key-lfcx_NaE.mjs";
9
+ import { t as exportJwk } from "../key-BYXnTGro.mjs";
10
10
  import { r as normalizeOutgoingActivityJsonLd } from "../outgoing-jsonld-4IJqPYos.mjs";
11
- import { l as verifyProof, r as signObject } from "../proof-B6gwdhN5.mjs";
11
+ import { l as verifyProof, r as signObject } from "../proof-CxsVG6vM.mjs";
12
12
  import { i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2 } from "../keys-DIJNHW-Y.mjs";
13
- import { n as FederationImpl } from "../middleware-CPx4ZWwt.mjs";
13
+ import { n as FederationImpl } from "../middleware-CpyCNOW_.mjs";
14
14
  import { Create, DataIntegrityProof, Note } from "@fedify/vocab";
15
15
  import { mockDocumentLoader, test } from "@fedify/fixture";
16
16
  import { exportDidKey, parseIri } from "@fedify/vocab-runtime";
@@ -1,14 +1,14 @@
1
1
  import "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { r as createRequestContext, t as createInboxContext } from "../context-DG5QeQ8W.mjs";
4
+ import { r as createRequestContext, t as createInboxContext } from "../context-DlZhxdFT.mjs";
5
5
  import { t as MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
6
6
  import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
7
7
  import "../std__assert-DvMDRPes.mjs";
8
- import { p as signJsonLd } from "../ld-jyjdrWjG.mjs";
9
- import { s as signRequest } from "../http-DKWi8RjI.mjs";
8
+ import { p as signJsonLd } from "../ld-DT3e2hOv.mjs";
9
+ import { s as signRequest } from "../http-C7qHlv-b.mjs";
10
10
  import { a as rsaPrivateKey3, c as rsaPublicKey3 } from "../keys-DIJNHW-Y.mjs";
11
- import { d as handleInbox, o as createFederation } from "../middleware-CPx4ZWwt.mjs";
11
+ import { o as createFederation, p as handleInbox } from "../middleware-CpyCNOW_.mjs";
12
12
  import { t as ActivityListenerSet } from "../activity-listener-C-BSbKI7.mjs";
13
13
  import { t as map_local_create_note_default } from "../map-local-create-note-B0SeXJms.mjs";
14
14
  import { Create } from "@fedify/vocab";
@@ -1,7 +1,7 @@
1
1
  import { Temporal } from "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as createOutboxContext, r as createRequestContext, t as createInboxContext } from "../context-DG5QeQ8W.mjs";
4
+ import { n as createOutboxContext, r as createRequestContext, t as createInboxContext } from "../context-DlZhxdFT.mjs";
5
5
  import { t as MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
6
6
  import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
7
7
  import { t as assertGreaterOrEqual } from "../assert_greater_or_equal-BlafOF4-.mjs";
@@ -10,12 +10,12 @@ import "../std__assert-DvMDRPes.mjs";
10
10
  import { t as assertRejects } from "../assert_rejects-CTptdYck.mjs";
11
11
  import { t as assert } from "../assert-D1Eafmd_.mjs";
12
12
  import { r as parseAcceptSignature } from "../accept-CPVqki78.mjs";
13
- import { a as generateCryptoKeyPair } from "../key-lfcx_NaE.mjs";
14
- import { a as compactJsonLd, p as signJsonLd } from "../ld-jyjdrWjG.mjs";
15
- import { r as signObject } from "../proof-B6gwdhN5.mjs";
16
- import { s as signRequest } from "../http-DKWi8RjI.mjs";
13
+ import { a as generateCryptoKeyPair } from "../key-BYXnTGro.mjs";
14
+ import { a as compactJsonLd, p as signJsonLd } from "../ld-DT3e2hOv.mjs";
15
+ import { r as signObject } from "../proof-CxsVG6vM.mjs";
16
+ import { s as signRequest } from "../http-C7qHlv-b.mjs";
17
17
  import { a as rsaPrivateKey3, c as rsaPublicKey3, s as rsaPublicKey2 } from "../keys-DIJNHW-Y.mjs";
18
- import { c as handleActor, d as handleInbox, f as handleObject, h as respondWithObjectIfAcceptable, l as handleCollection, m as respondWithObject, o as createFederation, p as handleOutbox, u as handleCustomCollection } from "../middleware-CPx4ZWwt.mjs";
18
+ import { _ as respondWithObjectIfAcceptable, d as handleCollection, f as handleCustomCollection, g as respondWithObject, h as handleOutbox, m as handleObject, o as createFederation, p as handleInbox, u as handleActor } from "../middleware-CpyCNOW_.mjs";
19
19
  import { t as ActivityListenerSet } from "../activity-listener-C-BSbKI7.mjs";
20
20
  import { Activity, Create, CryptographicKey, Multikey, Note, Person, Tombstone } from "@fedify/vocab";
21
21
  import { createTestMeterProvider, createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
@@ -10,8 +10,8 @@ import "../std__assert-DvMDRPes.mjs";
10
10
  import { t as assertStrictEquals } from "../assert_strict_equals-CYvBmkpC.mjs";
11
11
  import { t as assert } from "../assert-D1Eafmd_.mjs";
12
12
  import { r as ed25519PublicKey } from "../keys-DIJNHW-Y.mjs";
13
- import { _ as parseHashlinkGatewayRequest, o as createFederation } from "../middleware-CPx4ZWwt.mjs";
14
- import { r as createFederationBuilder } from "../builder-DVQ0yhKJ.mjs";
13
+ import { o as createFederation, y as parseHashlinkGatewayRequest } from "../middleware-CpyCNOW_.mjs";
14
+ import { r as createFederationBuilder } from "../builder-CVHpPAjK.mjs";
15
15
  import { n as RouterError } from "../router-u5O5KCQr.mjs";
16
16
  import { Note } from "@fedify/vocab";
17
17
  import { createTestMeterProvider, mockDocumentLoader, test } from "@fedify/fixture";
@@ -4,9 +4,9 @@ globalThis.addEventListener = () => {};
4
4
  import { t as MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
6
6
  import "../std__assert-DvMDRPes.mjs";
7
- import { r as signObject } from "../proof-B6gwdhN5.mjs";
7
+ import { r as signObject } from "../proof-CxsVG6vM.mjs";
8
8
  import { n as ed25519PrivateKey, r as ed25519PublicKey, t as ed25519Multikey } from "../keys-DIJNHW-Y.mjs";
9
- import { o as createFederation } from "../middleware-CPx4ZWwt.mjs";
9
+ import { o as createFederation } from "../middleware-CpyCNOW_.mjs";
10
10
  import { Create, Follow, Person } from "@fedify/vocab";
11
11
  import { mockDocumentLoader, test } from "@fedify/fixture";
12
12
  //#region src/federation/idempotency.test.ts
@@ -4,7 +4,7 @@ globalThis.addEventListener = () => {};
4
4
  import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
5
5
  import "../std__assert-DvMDRPes.mjs";
6
6
  import { t as assertRejects } from "../assert_rejects-CTptdYck.mjs";
7
- import { _ as recordKeyLookup, 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, m as recordDocumentFetch, p as recordDocumentCache, r as getFederationMetrics, t as classifyFetchError, u as recordCollectionPageItems, v as recordOutboxActivity, x as registerQueueDepthGauge, y as recordOutboxEnqueue } from "../metrics-B5Rei-HC.mjs";
7
+ import { _ as recordKeyLookup, 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, m as recordDocumentFetch, p as recordDocumentCache, r as getFederationMetrics, t as classifyFetchError, u as recordCollectionPageItems, v as recordOutboxActivity, x as registerQueueDepthGauge, y as recordOutboxEnqueue } from "../metrics-DvlvYpq_.mjs";
8
8
  import { createTestMeterProvider, test } from "@fedify/fixture";
9
9
  import { FetchError } from "@fedify/vocab-runtime";
10
10
  import { DataPointType, MeterProvider, MetricReader } from "@opentelemetry/sdk-metrics";
@@ -5,7 +5,7 @@ import { t as esm_default } from "../esm-BHXXx4Wx.mjs";
5
5
  import { t as MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
6
6
  import { t as ManualClockKvStore } from "../kv-DBRWVx3Q.mjs";
7
7
  import { a as numberSchema, r as envelopeSchema, t as MockQueue } from "../tasks-dbCShlCb.mjs";
8
- import "../testing-By1YYsIK.mjs";
8
+ import "../testing-CO_cEvQc.mjs";
9
9
  import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
10
10
  import { t as assertExists } from "../assert_exists-cffSpJ7X.mjs";
11
11
  import { t as assertFalse } from "../assert_false-CPdRnc3E.mjs";
@@ -16,14 +16,14 @@ import "../std__assert-DvMDRPes.mjs";
16
16
  import { t as assertRejects } from "../assert_rejects-CTptdYck.mjs";
17
17
  import { t as assertStrictEquals } from "../assert_strict_equals-CYvBmkpC.mjs";
18
18
  import { t as assert } from "../assert-D1Eafmd_.mjs";
19
- import { g as recordInboxActivity } from "../metrics-B5Rei-HC.mjs";
20
- import { a as compactJsonLd, h as verifyJsonLd, p as signJsonLd, s as detachSignature } from "../ld-jyjdrWjG.mjs";
21
- import { a as verifyObject, r as signObject } from "../proof-B6gwdhN5.mjs";
22
- import { l as verifyRequest, s as signRequest } from "../http-DKWi8RjI.mjs";
19
+ import { g as recordInboxActivity } from "../metrics-DvlvYpq_.mjs";
20
+ import { a as compactJsonLd, h as verifyJsonLd, p as signJsonLd, s as detachSignature } from "../ld-DT3e2hOv.mjs";
21
+ import { a as verifyObject, r as signObject } from "../proof-CxsVG6vM.mjs";
22
+ import { l as verifyRequest, s as signRequest } from "../http-C7qHlv-b.mjs";
23
23
  import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-DIJNHW-Y.mjs";
24
- import { t as getAuthenticatedDocumentLoader } from "../docloader-C6yOVoaF.mjs";
25
- import { i as KvSpecDeterminer, n as FederationImpl, o as createFederation, r as InboxContextImpl, t as ContextImpl, v as handleBenchmarkTrigger } from "../middleware-CPx4ZWwt.mjs";
26
- import { t as doesActorOwnKey } from "../owner-ByqNQVaa.mjs";
24
+ import { t as getAuthenticatedDocumentLoader } from "../docloader-C0SWQylk.mjs";
25
+ import { b as handleBenchmarkTrigger, i as KvSpecDeterminer, n as FederationImpl, o as createFederation, r as InboxContextImpl, t as ContextImpl } from "../middleware-CpyCNOW_.mjs";
26
+ import { t as doesActorOwnKey } from "../owner-CDsVeZI7.mjs";
27
27
  import { t as CircuitBreaker } from "../circuit-breaker-C5NqoLBJ.mjs";
28
28
  import { t as TaskCodec } from "../codec-C6rTrpIp.mjs";
29
29
  import { t as markCircuitBreakerLegacySweepDone } from "../circuit-breaker-test-utils-DW6YC_Pe.mjs";
@@ -1,6 +1,6 @@
1
1
  const { URLPattern } = require("urlpattern-polyfill");
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const require_federation = require("../federation-CUiHc7dP.cjs");
3
+ const require_federation = require("../federation-B1aeTKKN.cjs");
4
4
  exports.CircuitBreaker = require_federation.CircuitBreaker;
5
5
  exports.InProcessMessageQueue = require_federation.InProcessMessageQueue;
6
6
  exports.MemoryKvStore = require_federation.MemoryKvStore;
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { $ as MessageQueue, A as ObjectCallbackSetters, At as InboxListener, B as TaskDefinitionOptions, Bt as SharedInboxKeyDispatcher, C as FederationOptions, Ct as CollectionDispatcher, D as InboxChallengePolicy, Dt as HashlinkMediaDispatcher, E as IdempotencyStrategy, Et as CustomCollectionDispatcher, F as FederationQueueOptions, Ft as OutboxErrorHandler, G as RetryContext, Gt as SenderKeyPair, H as TaskHandler, Ht as UnverifiedActivityReason, I as createFederation, It as OutboxListener, J as RespondWithObjectOptions, Jt as digest, K as RetryPolicy, Kt as PageItems, L as Message, Lt as OutboxListenerErrorHandler, M as Rfc6570Expression, Mt as NodeInfoDispatcher, N as FederationKvPrefixes, Nt as ObjectAuthorizePredicate, O as InboxListenerSetters, Ot as HashlinkMediaRequest, P as FederationOrigin, Pt as ObjectDispatcher, Q as InProcessMessageQueueOptions, R as createFederationBuilder, Rt as OutboxPermanentFailureHandler, S as FederationFetchOptions, St as CollectionCursor, T as IdempotencyKeyCallback, Tt as CustomCollectionCursor, U as TaskRegistry, Ut as WebFingerLinksDispatcher, V as TaskEnqueueOptions, Vt as UnverifiedActivityHandler, W as CreateExponentialBackoffPolicyOptions, Wt as SendActivityError, X as respondWithObjectIfAcceptable, Y as respondWithObject, Z as InProcessMessageQueue, _ as CustomCollectionCallbackSetters, _t as ActorDispatcher, a as GetSignedKeyOptions, at as CircuitBreakerActivityDrop, b as FederationBenchmarkOptions, bt as AuthorizePredicate, c as ParseUriResult, ct as CircuitBreakerFailurePolicy, d as RouteActivityOptions, dt as CircuitBreakerState, et as MessageQueueDepth, f as SendActivityOptions, ft as CircuitBreakerStateChange, g as ConstructorWithTypeId, gt as ActorAliasMapper, h as CollectionCallbackSetters, ht as parseCircuitBreakerKvState, i as GetActorOptions, it as CircuitBreaker, j as OutboxListenerSetters, jt as MediaUploaderCallback, k as MediaUploaderSetters, kt as InboxErrorHandler, l as PortableRequest, lt as CircuitBreakerKvState, m as ActorCallbackSetters, mt as normalizeCircuitBreakerOptions, n as Context, nt as MessageQueueListenOptions, o as InboxContext, ot as CircuitBreakerBeforeSendDecision, p as SendActivityOptionsForCollection, pt as NormalizedCircuitBreakerOptions, q as createExponentialBackoffPolicy, qt as buildCollectionSynchronizationHeader, r as ForwardActivityOptions, rt as ParallelMessageQueue, s as OutboxContext, st as CircuitBreakerCreateOptions, t as ActorKeyPair, tt as MessageQueueEnqueueOptions, u as RequestContext, ut as CircuitBreakerOptions, v as Federatable, vt as ActorHandleMapper, w as FederationStartQueueOptions, wt as CustomCollectionCounter, x as FederationBuilder, xt as CollectionCounter, y as Federation, yt as ActorKeyPairsDispatcher, z as TaskDefinition, zt as PortableActorIdMapper } from "../context-DijrgHDe.cjs";
2
+ import { $ as InProcessMessageQueueOptions, A as ObjectCallbackSetters, At as InboxErrorHandler, B as TaskDefinition, Bt as PortableActorIdMapper, C as FederationOptions, Ct as CollectionCursor, D as InboxChallengePolicy, Dt as CustomCollectionDispatcher, E as IdempotencyStrategy, Et as CustomCollectionCursor, F as FederationOrigin, Ft as ObjectDispatcher, G as CreateExponentialBackoffPolicyOptions, Gt as SendActivityError, H as TaskEnqueueOptions, Ht as UnverifiedActivityHandler, I as FederationQueueOptions, It as OutboxErrorHandler, J as createExponentialBackoffPolicy, Jt as buildCollectionSynchronizationHeader, K as RetryContext, Kt as SenderKeyPair, L as createFederation, Lt as OutboxListener, M as PortableInboxForwardingOptions, Mt as MediaUploaderCallback, N as Rfc6570Expression, Nt as NodeInfoDispatcher, O as InboxListenerSetters, Ot as HashlinkMediaDispatcher, P as FederationKvPrefixes, Pt as ObjectAuthorizePredicate, Q as InProcessMessageQueue, R as Message, Rt as OutboxListenerErrorHandler, S as FederationFetchOptions, St as CollectionCounter, T as IdempotencyKeyCallback, Tt as CustomCollectionCounter, U as TaskHandler, Ut as UnverifiedActivityReason, V as TaskDefinitionOptions, Vt as SharedInboxKeyDispatcher, W as TaskRegistry, Wt as WebFingerLinksDispatcher, X as respondWithObject, Y as RespondWithObjectOptions, Yt as digest, Z as respondWithObjectIfAcceptable, _ as CustomCollectionCallbackSetters, _t as ActorAliasMapper, a as GetSignedKeyOptions, at as CircuitBreaker, b as FederationBenchmarkOptions, bt as ActorKeyPairsDispatcher, c as ParseUriResult, ct as CircuitBreakerCreateOptions, d as RouteActivityOptions, dt as CircuitBreakerOptions, et as MessageQueue, f as SendActivityOptions, ft as CircuitBreakerState, g as ConstructorWithTypeId, gt as parseCircuitBreakerKvState, h as CollectionCallbackSetters, ht as normalizeCircuitBreakerOptions, i as GetActorOptions, it as ParallelMessageQueue, j as OutboxListenerSetters, jt as InboxListener, k as MediaUploaderSetters, kt as HashlinkMediaRequest, l as PortableRequest, lt as CircuitBreakerFailurePolicy, m as ActorCallbackSetters, mt as NormalizedCircuitBreakerOptions, n as Context, nt as MessageQueueEnqueueOptions, o as InboxContext, ot as CircuitBreakerActivityDrop, p as SendActivityOptionsForCollection, pt as CircuitBreakerStateChange, q as RetryPolicy, qt as PageItems, r as ForwardActivityOptions, rt as MessageQueueListenOptions, s as OutboxContext, st as CircuitBreakerBeforeSendDecision, t as ActorKeyPair, tt as MessageQueueDepth, u as RequestContext, ut as CircuitBreakerKvState, v as Federatable, vt as ActorDispatcher, w as FederationStartQueueOptions, wt as CollectionDispatcher, x as FederationBuilder, xt as AuthorizePredicate, y as Federation, yt as ActorHandleMapper, z as createFederationBuilder, zt as OutboxPermanentFailureHandler } from "../context-CZjZYXFC.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-DTAaBwiY.cjs";
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, HashlinkMediaDispatcher, HashlinkMediaRequest, 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, PortableActorIdMapper, PortableRequest, 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 };
4
+ import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-JzkaEXsi.cjs";
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, HashlinkMediaDispatcher, HashlinkMediaRequest, 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, PortableActorIdMapper, PortableInboxForwardingOptions, PortableRequest, 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 };