@fedify/fedify 2.4.0-dev.2127 → 2.4.0-dev.2129

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 (91) hide show
  1. package/dist/{builder-B2bgGYbP.mjs → builder-C0bxZDL0.mjs} +3 -3
  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-SVlHSzV7.mjs → compound-proof-D9Kljk_7.mjs} +3 -3
  6. package/dist/{context-Ci5vuUr_.d.ts → context-Cz1w5Krc.d.ts} +1 -1
  7. package/dist/{context-Bm6ldGvx.d.cts → context-Dvec_D_h.d.cts} +1 -1
  8. package/dist/{deno-Be9xoxps.mjs → deno-_o3lkDlG.mjs} +1 -1
  9. package/dist/{docloader-Dtuyb0ps.mjs → docloader-BbS0rO-Y.mjs} +2 -2
  10. package/dist/federation/builder.test.mjs +1 -1
  11. package/dist/federation/compound-fanout.test.mjs +3 -3
  12. package/dist/federation/handler-compound-proof.test.mjs +3 -3
  13. package/dist/federation/handler.test.mjs +5 -5
  14. package/dist/federation/hashlink-media.test.mjs +2 -2
  15. package/dist/federation/idempotency.test.mjs +2 -2
  16. package/dist/federation/metrics.test.mjs +1 -1
  17. package/dist/federation/middleware.test.mjs +7 -7
  18. package/dist/federation/mod.cjs +1 -1
  19. package/dist/federation/mod.d.cts +2 -2
  20. package/dist/federation/mod.d.ts +2 -2
  21. package/dist/federation/mod.js +1 -1
  22. package/dist/federation/outgoing-proof.test.mjs +6 -6
  23. package/dist/federation/portable-actor.test.mjs +3 -3
  24. package/dist/federation/portable-chain.test.mjs +3 -3
  25. package/dist/federation/portable-gateway-keys.test.mjs +76 -5
  26. package/dist/federation/portable-inbox.test.mjs +9 -4
  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 +1 -1
  30. package/dist/federation/tasks/tasks.test.mjs +2 -2
  31. package/dist/federation/temporal.test.mjs +1 -1
  32. package/dist/federation/webfinger.test.mjs +1 -1
  33. package/dist/{federation-B6IHuS6n.cjs → federation-DRY8KrkB.cjs} +12 -12
  34. package/dist/{http-o8l4QeUY.cjs → http-B1J6E-bT.cjs} +384 -33
  35. package/dist/{http-BFeK9sBg.mjs → http-BpOiZE09.mjs} +18 -12
  36. package/dist/{http-D76Py0M4.d.cts → http-C-x_OLSp.d.ts} +57 -14
  37. package/dist/{http-Rmbiu-5S.js → http-C2M6wcs8.js} +374 -35
  38. package/dist/{http-BrQgkJay.d.ts → http-CjezPjFX.d.cts} +57 -14
  39. package/dist/{key-Cc1b6pW9.mjs → key-DolJjJab.mjs} +103 -16
  40. package/dist/{kv-cache-tLKBfxHc.mjs → kv-cache-Bq2cah0c.mjs} +1 -1
  41. package/dist/{kv-cache-BweDce2I.js → kv-cache-D7TiyMxv.js} +1 -1
  42. package/dist/{kv-cache-BUkgZAcX.cjs → kv-cache-D9nRbG2Q.cjs} +1 -1
  43. package/dist/{ld-DQNTIrAe.mjs → ld-Dwc176V4.mjs} +3 -3
  44. package/dist/{metrics-DDE9S63Q.mjs → metrics-CDaHfBXY.mjs} +1 -1
  45. package/dist/{middleware-CsQorLC_.mjs → middleware-CmB1FD8A.mjs} +1 -1
  46. package/dist/{middleware-K9aLnf57.js → middleware-CylX-pvI.js} +12 -12
  47. package/dist/{middleware-BdhvduR9.mjs → middleware-DN3MdTDg.mjs} +24 -24
  48. package/dist/{mod-Co53r-VP.d.ts → mod-Bz9tFXI2.d.ts} +1 -1
  49. package/dist/{mod-Cwdt_CWU.d.ts → mod-CZetqT5h.d.ts} +1 -1
  50. package/dist/{mod-Cr79cQlc.d.cts → mod-D4g9ffEn.d.cts} +1 -1
  51. package/dist/{mod-AVir5nVI.d.cts → mod-DGOIxEfb.d.cts} +1 -1
  52. package/dist/{mod-Byt5tvAS.d.cts → mod-S--JxYjo.d.cts} +1 -1
  53. package/dist/{mod-eVOUPbQE.d.ts → mod-owwElvpw.d.ts} +1 -1
  54. package/dist/mod.cjs +4 -4
  55. package/dist/mod.d.cts +5 -5
  56. package/dist/mod.d.ts +5 -5
  57. package/dist/mod.js +4 -4
  58. package/dist/nodeinfo/handler.test.mjs +1 -1
  59. package/dist/{owner-CCfdL83M.mjs → owner-BNHhwjNu.mjs} +37 -4
  60. package/dist/{portable-collection-WXaHkNqC.mjs → portable-collection-CRpTUHCY.mjs} +2 -2
  61. package/dist/{portable-collection-DdXsKBg4.js → portable-collection-CgglAI9B.js} +34 -1
  62. package/dist/{portable-collection-DXogVs__.cjs → portable-collection-PTGD0q70.cjs} +34 -1
  63. package/dist/portable-key-DqX2emHQ.mjs +395 -0
  64. package/dist/{portable-key-id-T7lecIbt.mjs → portable-key-id-Bg259c4Z.mjs} +69 -2
  65. package/dist/{proof-CW8k0R1G.mjs → proof-B4_0E-KU.mjs} +5 -5
  66. package/dist/{send--FORaIc4.mjs → send-Dpu5qbP5.mjs} +3 -3
  67. package/dist/sig/compound-proof-discovery.test.mjs +1 -1
  68. package/dist/sig/compound-proof-producer.test.mjs +1 -1
  69. package/dist/sig/compound-proof-verification.test.mjs +2 -2
  70. package/dist/sig/compound-proof.test.mjs +2 -2
  71. package/dist/sig/http.test.mjs +2 -2
  72. package/dist/sig/key.test.mjs +1 -1
  73. package/dist/sig/ld.test.mjs +2 -2
  74. package/dist/sig/mod.cjs +2 -2
  75. package/dist/sig/mod.d.cts +2 -2
  76. package/dist/sig/mod.d.ts +2 -2
  77. package/dist/sig/mod.js +2 -2
  78. package/dist/sig/owner.test.mjs +1 -1
  79. package/dist/sig/portable-collection.test.mjs +1 -1
  80. package/dist/sig/portable-key.test.mjs +479 -5
  81. package/dist/sig/proof.test.mjs +3 -3
  82. package/dist/{temporal-CffY_XOJ.mjs → temporal-78JVR3GK.mjs} +1 -1
  83. package/dist/testing/kv.test.mjs +1 -1
  84. package/dist/utils/docloader.test.mjs +2 -2
  85. package/dist/utils/kv-cache.test.mjs +1 -1
  86. package/dist/utils/mod.cjs +1 -1
  87. package/dist/utils/mod.d.cts +1 -1
  88. package/dist/utils/mod.d.ts +1 -1
  89. package/dist/utils/mod.js +1 -1
  90. package/package.json +6 -6
  91. package/dist/portable-key-C-fPq_Yf.mjs +0 -214
@@ -1,7 +1,7 @@
1
1
  /// <reference lib="esnext.temporal" />
2
2
  import { Actor, CryptographicKey, Multikey } from "@fedify/vocab";
3
- import { MeterProvider, TracerProvider } from "@opentelemetry/api";
4
3
  import { DocumentLoader } from "@fedify/vocab-runtime";
4
+ import { MeterProvider, TracerProvider } from "@opentelemetry/api";
5
5
 
6
6
  //#region src/sig/portable-key.d.ts
7
7
  /**
@@ -29,6 +29,28 @@ type PortableGatewayKeyResolution = {
29
29
  */
30
30
  readonly expires?: Temporal.Instant;
31
31
  };
32
+ /**
33
+ * The result of resolving a key of a portable actor at an `ap:` or
34
+ * `ap+ef61:` key ID.
35
+ * @internal
36
+ */
37
+ type PortableActorKeyResolution = Exclude<PortableGatewayKeyResolution, {
38
+ readonly type: "legacy";
39
+ }> | {
40
+ /**
41
+ * Whether the actor's document vouches for the key could not be
42
+ * determined, e.g., because no gateway could be reached.
43
+ */
44
+ readonly type: "unavailable";
45
+ readonly error: unknown;
46
+ /**
47
+ * Whether the failure can be cached as a failure to fetch the key, i.e.,
48
+ * every gateway failed to serve the actor's document at all. A failure
49
+ * that is not cacheable comes with an error that has no HTTP status,
50
+ * since none of the statuses describes the lookup as a whole.
51
+ */
52
+ readonly cacheable: boolean;
53
+ };
32
54
  //#endregion
33
55
  //#region src/sig/key.d.ts
34
56
  /**
@@ -119,17 +141,34 @@ interface FetchKeyOptions {
119
141
  */
120
142
  keyIdBoundByCaller?: boolean;
121
143
  /**
122
- * Resolves a gateway key of an [FEP-ef61] portable actor, i.e., a key whose
123
- * ID is a compatible identifier and dereferences to a portable actor's
124
- * document. Such a key is resolved only through this function, and is
125
- * rejected if it is omitted, so that only HTTP Signature verification,
126
- * which passes it, accepts gateway keys. Object Integrity Proofs and
127
- * Linked Data Signatures never do.
144
+ * Resolves keys of [FEP-ef61] portable actors, which only HTTP Signature
145
+ * verification passes, so that only it accepts them. Object Integrity
146
+ * Proofs and Linked Data Signatures never do: such a key is rejected if
147
+ * this is omitted.
128
148
  *
129
149
  * [FEP-ef61]: https://w3id.org/fep/ef61
130
150
  * @internal
131
151
  */
132
- portableGatewayKeyResolver?: (document: unknown, actor: Actor, keyId: URL) => Promise<PortableGatewayKeyResolution>;
152
+ portableKeyResolvers?: PortableKeyResolvers;
153
+ }
154
+ /**
155
+ * Resolves keys of [FEP-ef61] portable actors for HTTP Signature
156
+ * verification. See {@link FetchKeyOptions.portableKeyResolvers}.
157
+ *
158
+ * [FEP-ef61]: https://w3id.org/fep/ef61
159
+ * @internal
160
+ */
161
+ interface PortableKeyResolvers {
162
+ /**
163
+ * Resolves a gateway key, i.e., a key whose ID is a compatible identifier
164
+ * and dereferences to a portable actor's document.
165
+ */
166
+ gatewayKey(document: unknown, actor: Actor, keyId: URL): Promise<PortableGatewayKeyResolution>;
167
+ /**
168
+ * Resolves a key of a portable actor itself, i.e., a key whose ID is an
169
+ * `ap:` or `ap+ef61:` URI.
170
+ */
171
+ actorKey(keyId: URL): Promise<PortableActorKeyResolution>;
133
172
  }
134
173
  /**
135
174
  * The result of {@link fetchKey}.
@@ -182,9 +221,11 @@ type FetchableKeyClass<T extends CryptographicKey | Multikey> = (new (...args: a
182
221
  * Gateway keys of [FEP-ef61] portable actors, i.e., keys whose IDs are
183
222
  * compatible identifiers that dereference to portable actor documents, are
184
223
  * not resolved by this function, as they only authenticate HTTP requests;
185
- * use `verifyRequest()` or `getKeyOwner()` for them instead. Keys whose IDs
186
- * are compatible identifiers are never read from or written to the key
187
- * cache under their IDs, except for failures to fetch them.
224
+ * use `verifyRequest()` or `getKeyOwner()` for them instead. Nor are keys
225
+ * of portable actors whose IDs are `ap:` or `ap+ef61:` URIs, for the same
226
+ * reason. Keys whose IDs are compatible identifiers or `ap:` or `ap+ef61:`
227
+ * URIs are never read from or written to the key cache under their IDs,
228
+ * except for failures to fetch them.
188
229
  *
189
230
  * [FEP-ef61]: https://w3id.org/fep/ef61
190
231
  * @template T The type of the key to fetch. Either {@link CryptographicKey}
@@ -204,9 +245,11 @@ declare function fetchKey<T extends CryptographicKey | Multikey>(keyId: URL | st
204
245
  * Gateway keys of [FEP-ef61] portable actors, i.e., keys whose IDs are
205
246
  * compatible identifiers that dereference to portable actor documents, are
206
247
  * not resolved by this function, as they only authenticate HTTP requests;
207
- * use `verifyRequest()` or `getKeyOwner()` for them instead. Keys whose IDs
208
- * are compatible identifiers are never read from or written to the key
209
- * cache under their IDs, except for failures to fetch them.
248
+ * use `verifyRequest()` or `getKeyOwner()` for them instead. Nor are keys
249
+ * of portable actors whose IDs are `ap:` or `ap+ef61:` URIs, for the same
250
+ * reason. Keys whose IDs are compatible identifiers or `ap:` or `ap+ef61:`
251
+ * URIs are never read from or written to the key cache under their IDs,
252
+ * except for failures to fetch them.
210
253
  *
211
254
  * [FEP-ef61]: https://w3id.org/fep/ef61
212
255
  *
@@ -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-Be9xoxps.mjs";
5
- import { _ as recordKeyLookup, n as getDurationMs, t as classifyFetchError } from "./metrics-DDE9S63Q.mjs";
6
- import { a as isCompatibleKeyId, o as isPortableActorDocument, s as isPortableId } from "./portable-key-id-T7lecIbt.mjs";
4
+ import { n as version, t as name } from "./deno-_o3lkDlG.mjs";
5
+ import { _ as recordKeyLookup, n as getDurationMs, t as classifyFetchError } from "./metrics-CDaHfBXY.mjs";
6
+ import { c as isPortableId, f as parseKeyIdString, o as isCompatibleKeyId, s as isPortableActorDocument, u as isPortableUri } from "./portable-key-id-Bg259c4Z.mjs";
7
7
  import { getLogger } from "@logtape/logtape";
8
8
  import { CryptographicKey, Multikey, Object as Object$1, isActor } from "@fedify/vocab";
9
9
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
@@ -236,6 +236,17 @@ function bypassKeyCacheReads(keyCache) {
236
236
  };
237
237
  return bypassed;
238
238
  }
239
+ /**
240
+ * Parses a key ID given as a string. Unlike `new URL()`, it accepts `ap:`
241
+ * and `ap+ef61:` URIs, and refuses a portable or compatible key ID whose
242
+ * identity URL parsing would change, e.g., by resolving dot segments.
243
+ * @throws {TypeError} If the key ID is invalid.
244
+ */
245
+ function parseKeyIdOrThrow(keyId) {
246
+ const parsed = parseKeyIdString(keyId);
247
+ if (parsed == null) throw new TypeError(`Invalid key ID: ${keyId}`);
248
+ return parsed;
249
+ }
239
250
  async function withFetchKeySpan(keyId, tracerProvider, fetcher) {
240
251
  tracerProvider ??= trace.getTracerProvider();
241
252
  return await tracerProvider.getTracer(name, version).startActiveSpan("activitypub.fetch_key", {
@@ -272,9 +283,11 @@ async function withFetchKeySpan(keyId, tracerProvider, fetcher) {
272
283
  * Gateway keys of [FEP-ef61] portable actors, i.e., keys whose IDs are
273
284
  * compatible identifiers that dereference to portable actor documents, are
274
285
  * not resolved by this function, as they only authenticate HTTP requests;
275
- * use `verifyRequest()` or `getKeyOwner()` for them instead. Keys whose IDs
276
- * are compatible identifiers are never read from or written to the key
277
- * cache under their IDs, except for failures to fetch them.
286
+ * use `verifyRequest()` or `getKeyOwner()` for them instead. Nor are keys
287
+ * of portable actors whose IDs are `ap:` or `ap+ef61:` URIs, for the same
288
+ * reason. Keys whose IDs are compatible identifiers or `ap:` or `ap+ef61:`
289
+ * URIs are never read from or written to the key cache under their IDs,
290
+ * except for failures to fetch them.
278
291
  *
279
292
  * [FEP-ef61]: https://w3id.org/fep/ef61
280
293
  * @template T The type of the key to fetch. Either {@link CryptographicKey}
@@ -287,7 +300,7 @@ async function withFetchKeySpan(keyId, tracerProvider, fetcher) {
287
300
  * @since 1.3.0
288
301
  */
289
302
  function fetchKey(keyId, cls, options = {}) {
290
- keyId = typeof keyId === "string" ? new URL(keyId) : keyId;
303
+ keyId = typeof keyId === "string" ? parseKeyIdOrThrow(keyId) : keyId;
291
304
  return withFetchKeySpan(keyId, options.tracerProvider, () => fetchKeyInternal(keyId, cls, options));
292
305
  }
293
306
  /**
@@ -297,9 +310,11 @@ function fetchKey(keyId, cls, options = {}) {
297
310
  * Gateway keys of [FEP-ef61] portable actors, i.e., keys whose IDs are
298
311
  * compatible identifiers that dereference to portable actor documents, are
299
312
  * not resolved by this function, as they only authenticate HTTP requests;
300
- * use `verifyRequest()` or `getKeyOwner()` for them instead. Keys whose IDs
301
- * are compatible identifiers are never read from or written to the key
302
- * cache under their IDs, except for failures to fetch them.
313
+ * use `verifyRequest()` or `getKeyOwner()` for them instead. Nor are keys
314
+ * of portable actors whose IDs are `ap:` or `ap+ef61:` URIs, for the same
315
+ * reason. Keys whose IDs are compatible identifiers or `ap:` or `ap+ef61:`
316
+ * URIs are never read from or written to the key cache under their IDs,
317
+ * except for failures to fetch them.
303
318
  *
304
319
  * [FEP-ef61]: https://w3id.org/fep/ef61
305
320
  *
@@ -313,7 +328,7 @@ function fetchKey(keyId, cls, options = {}) {
313
328
  * @since 2.1.0
314
329
  */
315
330
  async function fetchKeyDetailed(keyId, cls, options = {}) {
316
- const cacheKey = typeof keyId === "string" ? new URL(keyId) : keyId;
331
+ const cacheKey = typeof keyId === "string" ? parseKeyIdOrThrow(keyId) : keyId;
317
332
  return await withFetchKeySpan(cacheKey, options.tracerProvider, async () => {
318
333
  return await fetchKeyWithResult(cacheKey, cls, options, async (cacheKey, keyId, keyCache, logger) => {
319
334
  const fetchError = await keyCache?.getFetchError?.(cacheKey);
@@ -452,7 +467,7 @@ async function resolveDidKey(cacheKey, cls, keyCache, logger) {
452
467
  cached: false
453
468
  };
454
469
  }
455
- async function resolveFetchedKey(document, cacheKey, documentUrl, keyId, cls, { documentLoader, contextLoader, keyCache, tracerProvider, keyIdBoundByCaller, portableGatewayKeyResolver }, logger) {
470
+ async function resolveFetchedKey(document, cacheKey, documentUrl, keyId, cls, { documentLoader, contextLoader, keyCache, tracerProvider, keyIdBoundByCaller, portableKeyResolvers }, logger) {
456
471
  let object;
457
472
  try {
458
473
  object = await Object$1.fromJsonLd(document, {
@@ -483,7 +498,7 @@ async function resolveFetchedKey(document, cacheKey, documentUrl, keyId, cls, {
483
498
  }
484
499
  if (isCompatibleKeyId(cacheKey) && isPortableActorDocument(object)) {
485
500
  const scopedCache = keyCache;
486
- if (portableGatewayKeyResolver == null || cls !== CryptographicKey) {
501
+ if (portableKeyResolvers == null || cls !== CryptographicKey) {
487
502
  logger.debug("Failed to verify; key {keyId} is a gateway key of the portable actor {actorId}, which is only accepted for HTTP Signatures.", {
488
503
  keyId,
489
504
  actorId: object.id?.href
@@ -494,7 +509,7 @@ async function resolveFetchedKey(document, cacheKey, documentUrl, keyId, cls, {
494
509
  cached: false
495
510
  };
496
511
  }
497
- const resolution = await portableGatewayKeyResolver(document, object, cacheKey);
512
+ const resolution = await portableKeyResolvers.gatewayKey(document, object, cacheKey);
498
513
  if (resolution.type !== "verified") {
499
514
  logger.debug("Failed to verify; the portable actor {actorId} does not vouch for its gateway key {keyId}.", {
500
515
  keyId,
@@ -654,6 +669,11 @@ async function fetchKeyWithResult(cacheKey, cls, options, onCachedUnavailable, o
654
669
  ]);
655
670
  const keyId = cacheKey.href;
656
671
  const keyCache = options.keyCache;
672
+ if (isPortableUri(cacheKey)) {
673
+ const result = await fetchPortableActorKey(cacheKey, cls, options, onCachedUnavailable, onFetchError, logger);
674
+ outcome = result.outcome;
675
+ return result.result;
676
+ }
657
677
  if (isCompatibleKeyId(cacheKey)) {
658
678
  const result = await fetchCompatibleKey(cacheKey, cls, options, onCachedUnavailable, onFetchError, logger);
659
679
  outcome = result.outcome;
@@ -705,7 +725,7 @@ async function fetchKeyWithResult(cacheKey, cls, options, onCachedUnavailable, o
705
725
  */
706
726
  function getCompatibleKeyScope(cls, options) {
707
727
  if (cls !== CryptographicKey) return "multikey";
708
- return options.portableGatewayKeyResolver == null ? "cryptographicKey" : "httpSignature";
728
+ return options.portableKeyResolvers == null ? "cryptographicKey" : "httpSignature";
709
729
  }
710
730
  /**
711
731
  * Looks up a key at an [FEP-ef61] compatible identifier. Such a key may be
@@ -759,8 +779,75 @@ async function fetchCompatibleKey(cacheKey, cls, options, onCachedUnavailable, o
759
779
  outcome: { result: resolved.key != null ? "fetched" : "invalid" }
760
780
  };
761
781
  }
782
+ /**
783
+ * Looks up a key of an [FEP-ef61] portable actor at an `ap:` or `ap+ef61:`
784
+ * key ID. Such a key is accepted only for HTTP Signatures, and is rejected
785
+ * for any other purpose without being fetched. Like keys at compatible
786
+ * identifiers, what it resolves to is cached in the namespace of the lookup's
787
+ * purpose, and a failure to fetch the actor's document from every gateway is
788
+ * cached in the shared namespace. A failure that is neither, e.g., one
789
+ * gateway being unreachable while another served an invalid document, is not
790
+ * cached at all.
791
+ *
792
+ * [FEP-ef61]: https://w3id.org/fep/ef61
793
+ */
794
+ async function fetchPortableActorKey(cacheKey, cls, options, onCachedUnavailable, onFetchError, logger) {
795
+ const keyId = cacheKey.href;
796
+ const resolvers = options.portableKeyResolvers;
797
+ if (resolvers == null || cls !== CryptographicKey) {
798
+ logger.debug("Failed to verify; key {keyId} is a key of a portable actor, which is only accepted for HTTP Signatures.", { keyId });
799
+ return {
800
+ result: {
801
+ key: null,
802
+ cached: false
803
+ },
804
+ outcome: { result: "invalid" }
805
+ };
806
+ }
807
+ const sharedCache = options.keyCache;
808
+ const scopedCache = sharedCache?.compatibleKeyScope?.("httpSignature");
809
+ const cached = await getCachedFetchKey(cacheKey, keyId, cls, scopedCache, logger);
810
+ if (cached != null) return {
811
+ result: cached,
812
+ outcome: { result: "hit" }
813
+ };
814
+ if (await sharedCache?.get(cacheKey) === null) {
815
+ logger.debug("Entry {keyId} found in cache, but it could not be fetched.", { keyId });
816
+ return {
817
+ result: await onCachedUnavailable(cacheKey, keyId, sharedCache, logger),
818
+ outcome: { result: "hit" }
819
+ };
820
+ }
821
+ logger.debug("Resolving key {keyId} to verify signature...", { keyId });
822
+ const resolution = await resolvers.actorKey(cacheKey);
823
+ if (resolution.type === "verified") {
824
+ await scopedCache?.set(cacheKey, resolution.key, { expires: resolution.expires });
825
+ return {
826
+ result: {
827
+ key: resolution.key,
828
+ cached: false
829
+ },
830
+ outcome: { result: "fetched" }
831
+ };
832
+ }
833
+ if (resolution.type === "rejected") {
834
+ await scopedCache?.set(cacheKey, null);
835
+ return {
836
+ result: {
837
+ key: null,
838
+ cached: false
839
+ },
840
+ outcome: { result: "invalid" }
841
+ };
842
+ }
843
+ await scopedCache?.delete(cacheKey);
844
+ return {
845
+ result: await onFetchError(resolution.error, cacheKey, keyId, resolution.cacheable ? sharedCache : void 0, logger),
846
+ outcome: resolution.cacheable ? classifyFetchError(resolution.error) : { result: "error" }
847
+ };
848
+ }
762
849
  async function fetchKeyInternal(keyId, cls, options = {}) {
763
- return await fetchKeyWithResult(typeof keyId === "string" ? new URL(keyId) : keyId, cls, options, (_cacheKey, _keyId, _keyCache, _logger) => {
850
+ return await fetchKeyWithResult(typeof keyId === "string" ? parseKeyIdOrThrow(keyId) : keyId, cls, options, (_cacheKey, _keyId, _keyCache, _logger) => {
764
851
  return {
765
852
  key: null,
766
853
  cached: true
@@ -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-DDE9S63Q.mjs";
4
+ import { p as recordDocumentCache } from "./metrics-CDaHfBXY.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,6 +1,6 @@
1
1
  import { Temporal } from "temporal-polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { H as validateCryptoKey, et as recordDocumentCache, t as doubleKnock } from "./http-Rmbiu-5S.js";
3
+ import { U as validateCryptoKey, t as doubleKnock, tt as recordDocumentCache } from "./http-C2M6wcs8.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
  import { UrlError, createActivityPubRequest, getRemoteDocument, logRequest, preloadedContexts, validatePublicUrl } from "@fedify/vocab-runtime";
6
6
  import { curry } from "es-toolkit";
@@ -1,5 +1,5 @@
1
1
  const { URLPattern } = require("urlpattern-polyfill");
2
- const require_http = require("./http-o8l4QeUY.cjs");
2
+ const require_http = require("./http-B1J6E-bT.cjs");
3
3
  let _logtape_logtape = require("@logtape/logtape");
4
4
  let _fedify_vocab_runtime = require("@fedify/vocab-runtime");
5
5
  let es_toolkit = require("es-toolkit");
@@ -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-Be9xoxps.mjs";
5
- import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-DDE9S63Q.mjs";
6
- import { c as validateCryptoKey, i as fetchKey, t as bypassKeyCacheReads } from "./key-Cc1b6pW9.mjs";
4
+ import { n as version, t as name } from "./deno-_o3lkDlG.mjs";
5
+ import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-CDaHfBXY.mjs";
6
+ import { c as validateCryptoKey, i as fetchKey, t as bypassKeyCacheReads } from "./key-DolJjJab.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-Be9xoxps.mjs";
4
+ import { n as version, t as name } from "./deno-_o3lkDlG.mjs";
5
5
  import { metrics } from "@opentelemetry/api";
6
6
  import { FetchError } from "@fedify/vocab-runtime";
7
7
  //#region src/federation/metrics.ts
@@ -1,5 +1,5 @@
1
1
  import "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as FederationImpl } from "./middleware-BdhvduR9.mjs";
4
+ import { n as FederationImpl } from "./middleware-DN3MdTDg.mjs";
5
5
  export { FederationImpl };
@@ -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 { $ as recordCollectionTotalItems, A as isInvalidUrlTypeError, C as compactJsonLd, D as hasSignature, E as getNormalizationContextLoader, F as wrapContextLoaderForJsonLd, G as getFederationMetrics, H as validateCryptoKey, I as exportJwk, J as isAbortError, K as getRemoteHost, M as verifyCompactJsonLd, O as hasSignatureLike, Q as recordCollectionRequest, T as detachSignature, V as importJwk, W as getDurationMs, X as recordCollectionDispatchDuration, Y as recordCircuitBreakerStateChange, Z as recordCollectionPageItems, _ as verifyPortableObjectProofWithRoot, _t as isPortableId, at as recordWebFingerHandle, b as InvalidContextReferenceError, bt as name, ct as formatAcceptSignature, d as hasProofLike, f as signObject, ft as getCanonicalPortableId, g as verifyPortableObjectProofPolicy, gt as isCompatibleKeyId, h as verifyPortableObjectProof, ht as hasPortableActor, i as selectRequestSignature, it as recordOutboxEnqueue, j as signJsonLd, k as isClearlyMalformedContextReference, l as InvalidPortableObjectIdError, m as verifyObject, mt as getPortableDid, n as listRequestSignatures, nt as recordInboxActivity, o as verifyRequest, ot as registerQueueDepthGauge, p as verifyMapLocalProof, pt as getGatewayKeyBase, q as instrumentDocumentLoader, r as parseRfc9421SignatureInput, rt as recordOutboxActivity, s as verifyRequestDetailed, st as preloadedOnlyDocumentLoader, t as doubleKnock, tt as recordFanoutRecipients, vt as isPortableUri, x as assertSafeJsonLd, xt as version, y as normalizeOutgoingActivityJsonLd } from "./http-Rmbiu-5S.js";
5
+ import { $ as recordCollectionRequest, A as isClearlyMalformedContextReference, Ct as version, D as getNormalizationContextLoader, E as detachSignature, G as getDurationMs, H as importJwk, I as wrapContextLoaderForJsonLd, J as instrumentDocumentLoader, K as getFederationMetrics, L as exportJwk, M as signJsonLd, N as verifyCompactJsonLd, O as hasSignature, Q as recordCollectionPageItems, S as assertSafeJsonLd, St as name, U as validateCryptoKey, X as recordCircuitBreakerStateChange, Y as isAbortError, Z as recordCollectionDispatchDuration, _ as verifyPortableObjectProofPolicy, _t as isCompatibleKeyId, at as recordOutboxEnqueue, b as normalizeOutgoingActivityJsonLd, bt as isPortableUri, ct as preloadedOnlyDocumentLoader, et as recordCollectionTotalItems, f as hasProofLike, g as verifyPortableObjectProof, gt as hasPortableActor, h as verifyObject, ht as getPortableDid, i as selectRequestSignature, it as recordOutboxActivity, j as isInvalidUrlTypeError, k as hasSignatureLike, lt as formatAcceptSignature, m as verifyMapLocalProof, mt as getGatewayKeyBase, n as listRequestSignatures, nt as recordFanoutRecipients, o as verifyRequest, ot as recordWebFingerHandle, p as signObject, pt as getCanonicalPortableId, q as getRemoteHost, r as parseRfc9421SignatureInput, rt as recordInboxActivity, s as verifyRequestDetailed, st as registerQueueDepthGauge, t as doubleKnock, u as InvalidPortableObjectIdError, v as verifyPortableObjectProofWithRoot, vt as isPortableId, w as compactJsonLd, x as InvalidContextReferenceError, yt as isPortableKeyId } from "./http-C2M6wcs8.js";
6
6
  import { a as MAX_BODY_SIZE, i as BodyTooLargeError, n as getNodeInfo, o as readBoundedText, t as nodeInfoToJson } from "./types-C_cNlNVK.js";
7
- import { n as doesActorOwnKey, r as getKeyOwner, t as verifyPortableObject } from "./portable-collection-DdXsKBg4.js";
8
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-BweDce2I.js";
7
+ import { n as doesActorOwnKey, r as getKeyOwner, t as verifyPortableObject } from "./portable-collection-CgglAI9B.js";
8
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-D7TiyMxv.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";
@@ -4665,7 +4665,7 @@ async function handleInboxInternal(request, parameters, span) {
4665
4665
  "http_signatures.verified": httpSigKey != null,
4666
4666
  "http_signatures.key_id": httpSigKey?.id?.href ?? ""
4667
4667
  });
4668
- if (!skipSignatureVerification && !proofVerified && (isPortableActivity(activity) || isPortableGatewayKey(httpSigKey))) {
4668
+ if (!skipSignatureVerification && !proofVerified && (isPortableActivity(activity) || isPortableActorKey(httpSigKey))) {
4669
4669
  if (deferredLdSignatureError != null) throw deferredLdSignatureError;
4670
4670
  logger.error("The activity {activityId} of the portable actor {actorId} is not authenticated by a valid Object Integrity Proof.", {
4671
4671
  activity: json,
@@ -5446,13 +5446,13 @@ const MIN_COMPONENTS = [
5446
5446
  "@authority"
5447
5447
  ];
5448
5448
  /**
5449
- * Checks whether an HTTP Signature key is a gateway key of an FEP-ef61
5450
- * portable actor, i.e., its ID is a compatible identifier and it is owned by
5451
- * a portable actor, which only the portable actor's signed document can
5452
- * establish.
5449
+ * Checks whether an HTTP Signature key is a key of an FEP-ef61 portable
5450
+ * actor, i.e., its ID is a compatible identifier or an `ap:` or `ap+ef61:`
5451
+ * URI, and it is owned by a portable actor, which only the portable actor's
5452
+ * signed document can establish.
5453
5453
  */
5454
- function isPortableGatewayKey(key) {
5455
- return key?.id != null && isCompatibleKeyId(key.id) && key.ownerId != null && isPortableId(key.ownerId);
5454
+ function isPortableActorKey(key) {
5455
+ return key?.id != null && isPortableKeyId(key.id) && key.ownerId != null && isPortableId(key.ownerId);
5456
5456
  }
5457
5457
  /**
5458
5458
  * Checks whether an activity needs an Object Integrity Proof by its DID:
@@ -5801,7 +5801,7 @@ async function signOutgoingActivity(activity, candidates, options) {
5801
5801
  hasProof = true;
5802
5802
  break;
5803
5803
  }
5804
- const keys = candidates.filter((c) => c.privateKey.algorithm.name === "Ed25519" && !isCompatibleKeyId(c.verificationMethod));
5804
+ const keys = candidates.filter((c) => c.privateKey.algorithm.name === "Ed25519" && !isPortableKeyId(c.verificationMethod));
5805
5805
  if (!hasProof && activity.id != null && isPortableId(activity.id)) return await sign(selectPortableActivityKey(activity, activity.id, keys));
5806
5806
  if (keys.length < 1 || hasProof && !options.appendToExistingProofs) return {
5807
5807
  activity,
@@ -7766,7 +7766,7 @@ var FederationImpl = class extends FederationBuilderImpl {
7766
7766
  const ldSignable = !hasPortableActor(activity);
7767
7767
  for (const { keyId, privateKey } of keys) {
7768
7768
  validateCryptoKey(privateKey, "private");
7769
- if (ldSignable && rsaKey == null && privateKey.algorithm.name === "RSASSA-PKCS1-v1_5" && !isCompatibleKeyId(keyId)) rsaKey = {
7769
+ if (ldSignable && rsaKey == null && privateKey.algorithm.name === "RSASSA-PKCS1-v1_5" && !isPortableKeyId(keyId)) rsaKey = {
7770
7770
  keyId,
7771
7771
  privateKey
7772
7772
  };
@@ -1,29 +1,29 @@
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-Be9xoxps.mjs";
5
- import { a as instrumentDocumentLoader, b as recordWebFingerHandle, c as recordCircuitBreakerStateChange, d as recordCollectionRequest, f as recordCollectionTotalItems, g as recordInboxActivity, h as recordFanoutRecipients, i as getRemoteHost, l as recordCollectionDispatchDuration, n as getDurationMs, o as isAbortError, r as getFederationMetrics, u as recordCollectionPageItems, v as recordOutboxActivity, x as registerQueueDepthGauge, y as recordOutboxEnqueue } from "./metrics-DDE9S63Q.mjs";
4
+ import { n as version, t as name } from "./deno-_o3lkDlG.mjs";
5
+ import { a as instrumentDocumentLoader, b as recordWebFingerHandle, c as recordCircuitBreakerStateChange, d as recordCollectionRequest, f as recordCollectionTotalItems, g as recordInboxActivity, h as recordFanoutRecipients, i as getRemoteHost, l as recordCollectionDispatchDuration, n as getDurationMs, o as isAbortError, r as getFederationMetrics, u as recordCollectionPageItems, v as recordOutboxActivity, x as registerQueueDepthGauge, y as recordOutboxEnqueue } from "./metrics-CDaHfBXY.mjs";
6
6
  import { t as formatAcceptSignature } from "./accept-CPVqki78.mjs";
7
- import { a as isCompatibleKeyId, c as isPortableUri, i as hasPortableActor, n as getGatewayKeyBase, r as getPortableDid, s as isPortableId, t as getCanonicalPortableId } from "./portable-key-id-T7lecIbt.mjs";
8
- import { c as validateCryptoKey, n as exportJwk, s as importJwk } from "./key-Cc1b6pW9.mjs";
7
+ import { a as hasPortableActor, c as isPortableId, l as isPortableKeyId, n as getGatewayKeyBase, o as isCompatibleKeyId, r as getPortableDid, t as getCanonicalPortableId, u as isPortableUri } from "./portable-key-id-Bg259c4Z.mjs";
8
+ import { c as validateCryptoKey, n as exportJwk, s as importJwk } from "./key-DolJjJab.mjs";
9
9
  import { r as normalizeOutgoingActivityJsonLd } from "./outgoing-jsonld-4IJqPYos.mjs";
10
- import { _ as wrapContextLoaderForJsonLd, a as compactJsonLd, c as getNormalizationContextLoader, d as isClearlyMalformedContextReference, f as isInvalidUrlTypeError, l as hasSignature, m as verifyCompactJsonLd, p as signJsonLd, r as assertSafeJsonLd, s as detachSignature, t as InvalidContextReferenceError, u as hasSignatureLike } from "./ld-DQNTIrAe.mjs";
11
- import { i as signObject, l as verifyPortableObjectProofWithRoot, o as verifyObject, r as hasProofLike, s as verifyPortableObjectProof, t as InvalidPortableObjectIdError } from "./proof-CW8k0R1G.mjs";
12
- import { a as listRequestSignatures, c as selectRequestSignature, d as verifyRequest, f as verifyRequestDetailed, s as parseRfc9421SignatureInput } from "./http-BFeK9sBg.mjs";
13
- import { t as getAuthenticatedDocumentLoader } from "./docloader-Dtuyb0ps.mjs";
14
- import { n as kvCache } from "./kv-cache-tLKBfxHc.mjs";
10
+ import { _ as wrapContextLoaderForJsonLd, a as compactJsonLd, c as getNormalizationContextLoader, d as isClearlyMalformedContextReference, f as isInvalidUrlTypeError, l as hasSignature, m as verifyCompactJsonLd, p as signJsonLd, r as assertSafeJsonLd, s as detachSignature, t as InvalidContextReferenceError, u as hasSignatureLike } from "./ld-Dwc176V4.mjs";
11
+ import { i as signObject, l as verifyPortableObjectProofWithRoot, o as verifyObject, r as hasProofLike, s as verifyPortableObjectProof, t as InvalidPortableObjectIdError } from "./proof-B4_0E-KU.mjs";
12
+ import { a as listRequestSignatures, c as selectRequestSignature, d as verifyRequest, f as verifyRequestDetailed, s as parseRfc9421SignatureInput } from "./http-BpOiZE09.mjs";
13
+ import { t as getAuthenticatedDocumentLoader } from "./docloader-BbS0rO-Y.mjs";
14
+ import { n as kvCache } from "./kv-cache-Bq2cah0c.mjs";
15
15
  import { d as readBoundedText, l as BodyTooLargeError, t as getNodeInfo, u as MAX_BODY_SIZE } from "./client-DpnpgjyX.mjs";
16
16
  import { t as nodeInfoToJson } from "./types-DE_LV1JB.mjs";
17
- import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-CCfdL83M.mjs";
18
- import { t as verifyPortableObject } from "./portable-collection-WXaHkNqC.mjs";
19
- import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send--FORaIc4.mjs";
20
- import { n as FederationBuilderImpl, t as ACTOR_ALIAS_PREFIX } from "./builder-B2bgGYbP.mjs";
17
+ import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-BNHhwjNu.mjs";
18
+ import { t as verifyPortableObject } from "./portable-collection-CRpTUHCY.mjs";
19
+ import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send-Dpu5qbP5.mjs";
20
+ import { n as FederationBuilderImpl, t as ACTOR_ALIAS_PREFIX } from "./builder-C0bxZDL0.mjs";
21
21
  import { t as CircuitBreaker } from "./circuit-breaker-C5NqoLBJ.mjs";
22
22
  import { t as buildCollectionSynchronizationHeader } from "./collection-CnnP1UAv.mjs";
23
- import { a as verifyCompoundPortableObjectProofs, i as inspectCompoundPortableObjectApplicability, r as findUnsupportedCompoundProofShape, t as containsCompoundPortableObject } from "./compound-proof-SVlHSzV7.mjs";
23
+ import { a as verifyCompoundPortableObjectProofs, i as inspectCompoundPortableObjectApplicability, r as findUnsupportedCompoundProofShape, t as containsCompoundPortableObject } from "./compound-proof-D9Kljk_7.mjs";
24
24
  import { t as KvKeyCache } from "./keycache-BInaECGj.mjs";
25
25
  import { t as acceptsJsonLd } from "./negotiation-CCocWT_N.mjs";
26
- import { t as hasMalformedKnownTemporalLiteral } from "./temporal-CffY_XOJ.mjs";
26
+ import { t as hasMalformedKnownTemporalLiteral } from "./temporal-78JVR3GK.mjs";
27
27
  import { t as createExponentialBackoffPolicy } from "./retry-zX5xw5e0.mjs";
28
28
  import { t as TaskCodec } from "./codec-C6rTrpIp.mjs";
29
29
  import { getLogger, withContext } from "@logtape/logtape";
@@ -2309,7 +2309,7 @@ async function handleInboxInternal(request, parameters, span) {
2309
2309
  "http_signatures.verified": httpSigKey != null,
2310
2310
  "http_signatures.key_id": httpSigKey?.id?.href ?? ""
2311
2311
  });
2312
- if (!skipSignatureVerification && !proofVerified && (isPortableActivity(activity) || isPortableGatewayKey(httpSigKey))) {
2312
+ if (!skipSignatureVerification && !proofVerified && (isPortableActivity(activity) || isPortableActorKey(httpSigKey))) {
2313
2313
  if (deferredLdSignatureError != null) throw deferredLdSignatureError;
2314
2314
  logger.error("The activity {activityId} of the portable actor {actorId} is not authenticated by a valid Object Integrity Proof.", {
2315
2315
  activity: json,
@@ -3090,13 +3090,13 @@ const MIN_COMPONENTS = [
3090
3090
  "@authority"
3091
3091
  ];
3092
3092
  /**
3093
- * Checks whether an HTTP Signature key is a gateway key of an FEP-ef61
3094
- * portable actor, i.e., its ID is a compatible identifier and it is owned by
3095
- * a portable actor, which only the portable actor's signed document can
3096
- * establish.
3093
+ * Checks whether an HTTP Signature key is a key of an FEP-ef61 portable
3094
+ * actor, i.e., its ID is a compatible identifier or an `ap:` or `ap+ef61:`
3095
+ * URI, and it is owned by a portable actor, which only the portable actor's
3096
+ * signed document can establish.
3097
3097
  */
3098
- function isPortableGatewayKey(key) {
3099
- return key?.id != null && isCompatibleKeyId(key.id) && key.ownerId != null && isPortableId(key.ownerId);
3098
+ function isPortableActorKey(key) {
3099
+ return key?.id != null && isPortableKeyId(key.id) && key.ownerId != null && isPortableId(key.ownerId);
3100
3100
  }
3101
3101
  /**
3102
3102
  * Checks whether an activity needs an Object Integrity Proof by its DID:
@@ -3215,7 +3215,7 @@ async function signOutgoingActivity(activity, candidates, options) {
3215
3215
  hasProof = true;
3216
3216
  break;
3217
3217
  }
3218
- const keys = candidates.filter((c) => c.privateKey.algorithm.name === "Ed25519" && !isCompatibleKeyId(c.verificationMethod));
3218
+ const keys = candidates.filter((c) => c.privateKey.algorithm.name === "Ed25519" && !isPortableKeyId(c.verificationMethod));
3219
3219
  if (!hasProof && activity.id != null && isPortableId(activity.id)) return await sign(selectPortableActivityKey(activity, activity.id, keys));
3220
3220
  if (keys.length < 1 || hasProof && !options.appendToExistingProofs) return {
3221
3221
  activity,
@@ -5001,7 +5001,7 @@ var FederationImpl = class extends FederationBuilderImpl {
5001
5001
  const ldSignable = !hasPortableActor(activity);
5002
5002
  for (const { keyId, privateKey } of keys) {
5003
5003
  validateCryptoKey(privateKey, "private");
5004
- if (ldSignable && rsaKey == null && privateKey.algorithm.name === "RSASSA-PKCS1-v1_5" && !isCompatibleKeyId(keyId)) rsaKey = {
5004
+ if (ldSignable && rsaKey == null && privateKey.algorithm.name === "RSASSA-PKCS1-v1_5" && !isPortableKeyId(keyId)) rsaKey = {
5005
5005
  keyId,
5006
5006
  privateKey
5007
5007
  };
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { S as KeyCache } from "./http-BrQgkJay.js";
2
+ import { S as KeyCache } from "./http-C-x_OLSp.js";
3
3
  import { CryptographicKey, DataIntegrityProof, Multikey, Object as Object$1 } from "@fedify/vocab";
4
4
  import { MeterProvider, TracerProvider } from "@opentelemetry/api";
5
5
  import { DocumentLoader, PortableObjectVerifier, PortableObjectVerifierOptions } from "@fedify/vocab-runtime";
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { n as HttpMessageSignaturesSpecDeterminer } from "./http-BrQgkJay.js";
2
+ import { n as HttpMessageSignaturesSpecDeterminer } from "./http-C-x_OLSp.js";
3
3
  import { n as KvStore, t as KvKey } from "./kv-BhNbN8Ed.js";
4
4
  import { t as DocumentFetchKind } from "./metrics-DoRtI0qU.js";
5
5
  import { MeterProvider, TracerProvider } from "@opentelemetry/api";
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { n as HttpMessageSignaturesSpecDeterminer } from "./http-D76Py0M4.cjs";
2
+ import { n as HttpMessageSignaturesSpecDeterminer } from "./http-CjezPjFX.cjs";
3
3
  import { n as KvStore, t as KvKey } from "./kv-BhNbN8Ed.cjs";
4
4
  import { t as DocumentFetchKind } from "./metrics-DVKYY6K1.cjs";
5
5
  import { DocumentLoader, DocumentLoaderFactoryOptions } from "@fedify/vocab-runtime";
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { Gt as WebFingerLinksDispatcher, bt as ActorHandleMapper, d as RequestContext, vt as ActorAliasMapper, yt as ActorDispatcher } from "./context-Bm6ldGvx.cjs";
2
+ import { Gt as WebFingerLinksDispatcher, bt as ActorHandleMapper, d as RequestContext, vt as ActorAliasMapper, yt as ActorDispatcher } from "./context-Dvec_D_h.cjs";
3
3
  import { MeterProvider, Span, Tracer } from "@opentelemetry/api";
4
4
  import { RouterError, RouterOptions, RouterRouteResult } from "@fedify/uri-template";
5
5
 
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { S as KeyCache } from "./http-D76Py0M4.cjs";
2
+ import { S as KeyCache } from "./http-CjezPjFX.cjs";
3
3
  import { CryptographicKey, DataIntegrityProof, Multikey, Object as Object$1 } from "@fedify/vocab";
4
4
  import { DocumentLoader, PortableObjectVerifier, PortableObjectVerifierOptions } from "@fedify/vocab-runtime";
5
5
  import { MeterProvider, TracerProvider } from "@opentelemetry/api";
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { Gt as WebFingerLinksDispatcher, bt as ActorHandleMapper, d as RequestContext, vt as ActorAliasMapper, yt as ActorDispatcher } from "./context-Ci5vuUr_.js";
2
+ import { Gt as WebFingerLinksDispatcher, bt as ActorHandleMapper, d as RequestContext, vt as ActorAliasMapper, yt as ActorDispatcher } from "./context-Cz1w5Krc.js";
3
3
  import { RouterError, RouterOptions, RouterRouteResult } from "@fedify/uri-template";
4
4
  import { MeterProvider, Span, Tracer } from "@opentelemetry/api";
5
5
 
package/dist/mod.cjs CHANGED
@@ -3,11 +3,11 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  require("./rolldown-runtime-Dmm3t92W.cjs");
4
4
  const require_transformers = require("./transformers-BalCrSsr.cjs");
5
5
  require("./compat/mod.cjs");
6
- const require_http = require("./http-o8l4QeUY.cjs");
7
- const require_federation = require("./federation-B6IHuS6n.cjs");
6
+ const require_http = require("./http-B1J6E-bT.cjs");
7
+ const require_federation = require("./federation-DRY8KrkB.cjs");
8
8
  const require_types = require("./types-Be2zbyeG.cjs");
9
- const require_portable_collection = require("./portable-collection-DXogVs__.cjs");
10
- const require_kv_cache = require("./kv-cache-BUkgZAcX.cjs");
9
+ const require_portable_collection = require("./portable-collection-PTGD0q70.cjs");
10
+ const require_kv_cache = require("./kv-cache-D9nRbG2Q.cjs");
11
11
  require("./nodeinfo/mod.cjs");
12
12
  require("./runtime/mod.cjs");
13
13
  require("./sig/mod.cjs");