@fedify/fedify 2.4.0-dev.2212 → 2.4.0-dev.2228

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 (92) hide show
  1. package/dist/{builder-CKAVFvcH.mjs → builder-Wx64uCV2.mjs} +10 -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-BP5SOdXv.mjs → compound-proof-B647GUyL.mjs} +2 -2
  6. package/dist/{context-Bl_Y7T_3.d.cts → context-B6X-t8gI.d.cts} +1 -1
  7. package/dist/{context-DMd11IAu.d.ts → context-CtI307_A.d.ts} +1 -1
  8. package/dist/{deno-BKp9fYB3.mjs → deno-9flirCWb.mjs} +1 -1
  9. package/dist/{docloader-BjJreYQU.mjs → docloader-pjAbs1lc.mjs} +2 -2
  10. package/dist/federation/builder.test.mjs +37 -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 +123 -7
  18. package/dist/federation/mod.cjs +1 -1
  19. package/dist/federation/mod.d.cts +3 -3
  20. package/dist/federation/mod.d.ts +3 -3
  21. package/dist/federation/mod.js +1 -1
  22. package/dist/federation/outgoing-proof.test.mjs +248 -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-collection.test.mjs +4 -4
  26. package/dist/federation/portable-delivery.test.mjs +2 -2
  27. package/dist/federation/portable-gateway-keys.test.mjs +4 -4
  28. package/dist/federation/portable-inbox.test.mjs +4 -4
  29. package/dist/federation/portable-parse-uri.test.mjs +1 -1
  30. package/dist/federation/portable-route-activity.test.mjs +2 -2
  31. package/dist/federation/portable.test.mjs +80 -3
  32. package/dist/federation/send.test.mjs +3 -3
  33. package/dist/federation/tasks/enqueue.test.mjs +1 -1
  34. package/dist/federation/tasks/tasks.test.mjs +2 -2
  35. package/dist/federation/temporal.test.mjs +1 -1
  36. package/dist/federation/webfinger.test.mjs +1 -1
  37. package/dist/{federation-B-0EXZPH.cjs → federation-DiycMKQx.cjs} +262 -36
  38. package/dist/{http-Di8yiDMY.js → http-CHqz_Jp6.js} +1 -1
  39. package/dist/{http-ByBlnY3D.cjs → http-DC5DyShJ.cjs} +1 -1
  40. package/dist/{http--IGUT1mg.mjs → http-DysQjjJe.mjs} +4 -4
  41. package/dist/{key-ChfV9C3v.mjs → key-TtgqklZ1.mjs} +2 -2
  42. package/dist/{kv-BhNbN8Ed.d.cts → kv-B2mzK5tl.d.cts} +3 -2
  43. package/dist/{kv-BhNbN8Ed.d.ts → kv-B2mzK5tl.d.ts} +3 -2
  44. package/dist/{kv-cache-DFIUR-E5.mjs → kv-cache-B7g5Tvl0.mjs} +1 -1
  45. package/dist/{kv-cache-DpwDPt9V.js → kv-cache-CgYK8siN.js} +1 -1
  46. package/dist/{kv-cache-BDwUzxBJ.cjs → kv-cache-CsNDrjVT.cjs} +1 -1
  47. package/dist/{ld-DBBVabBC.mjs → ld-CHYUee-s.mjs} +3 -3
  48. package/dist/{metrics-DPQKFkiJ.mjs → metrics-X1lpKWRK.mjs} +1 -1
  49. package/dist/{middleware-VXGLiHtY.js → middleware-D2scpP9Q.js} +262 -36
  50. package/dist/{middleware-BW7-tHAG.mjs → middleware-DoAk0Q3s.mjs} +251 -33
  51. package/dist/{middleware-G9zpxUsD.mjs → middleware-ndPtgYYI.mjs} +1 -1
  52. package/dist/{mod-C5Mwx5ty.d.ts → mod-B8MI1mpi.d.ts} +1 -1
  53. package/dist/{mod-BVNGHgVr.d.ts → mod-BhTaDR5H.d.ts} +1 -1
  54. package/dist/{mod-Cyy1Wahy.d.cts → mod-C7_2j7VT.d.cts} +1 -1
  55. package/dist/{mod-Dp3Ij7sw.d.cts → mod-DFL6IxYQ.d.cts} +1 -1
  56. package/dist/mod.cjs +4 -4
  57. package/dist/mod.d.cts +4 -4
  58. package/dist/mod.d.ts +4 -4
  59. package/dist/mod.js +4 -4
  60. package/dist/nodeinfo/handler.test.mjs +1 -1
  61. package/dist/otel/mod.d.cts +1 -1
  62. package/dist/otel/mod.d.ts +1 -1
  63. package/dist/{owner-BW5VsXG3.mjs → owner-BP_ouAvi.mjs} +3 -3
  64. package/dist/{portable-collection-FTPa5D91.js → portable-collection-4SnmDcTc.js} +1 -1
  65. package/dist/{portable-collection-CXcAlwei.cjs → portable-collection-Cz9K1Tas.cjs} +1 -1
  66. package/dist/{portable-collection-Ct99JsBe.mjs → portable-collection-SqxusPj7.mjs} +2 -2
  67. package/dist/{portable-key-U3lW06QJ.mjs → portable-key-DYr6MZUl.mjs} +1 -1
  68. package/dist/{proof-MFz2960e.mjs → proof-B-iLzyva.mjs} +4 -4
  69. package/dist/{send-Duj8xys1.mjs → send-D0nNms3Q.mjs} +3 -3
  70. package/dist/sig/compound-proof-discovery.test.mjs +1 -1
  71. package/dist/sig/compound-proof-producer.test.mjs +1 -1
  72. package/dist/sig/compound-proof-verification.test.mjs +2 -2
  73. package/dist/sig/compound-proof.test.mjs +2 -2
  74. package/dist/sig/http.test.mjs +2 -2
  75. package/dist/sig/key.test.mjs +1 -1
  76. package/dist/sig/ld.test.mjs +2 -2
  77. package/dist/sig/mod.cjs +2 -2
  78. package/dist/sig/mod.js +2 -2
  79. package/dist/sig/owner.test.mjs +1 -1
  80. package/dist/sig/portable-collection.test.mjs +1 -1
  81. package/dist/sig/portable-key.test.mjs +6 -6
  82. package/dist/sig/proof.test.mjs +5 -3
  83. package/dist/{temporal-CVcPKB1N.mjs → temporal-39Ixir8d.mjs} +1 -1
  84. package/dist/testing/kv.test.mjs +1 -1
  85. package/dist/testing/mod.d.mts +3 -2
  86. package/dist/utils/docloader.test.mjs +2 -2
  87. package/dist/utils/kv-cache.test.mjs +1 -1
  88. package/dist/utils/mod.cjs +1 -1
  89. package/dist/utils/mod.d.cts +1 -1
  90. package/dist/utils/mod.d.ts +1 -1
  91. package/dist/utils/mod.js +1 -1
  92. package/package.json +6 -6
@@ -3,28 +3,28 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { d as isPortableUri, f as isSameObjectId, i as getPortableDid, l as isPortableId, n as getCanonicalPortableId, o as hasPortableActor, r as getGatewayKeyBase, s as isCompatibleKeyId, t as getAuthenticationOrigin, u as isPortableKeyId } from "./portable-key-id-Ca30-hOa.mjs";
5
5
  import { n as isPubliclyAddressedNode, t as isInAudience } from "./audience-CHQ-FlLD.mjs";
6
- import { n as version, t as name } from "./deno-BKp9fYB3.mjs";
7
- 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-DPQKFkiJ.mjs";
6
+ import { n as version, t as name } from "./deno-9flirCWb.mjs";
7
+ 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-X1lpKWRK.mjs";
8
8
  import { t as formatAcceptSignature } from "./accept-CPVqki78.mjs";
9
- import { c as validateCryptoKey, n as exportJwk, s as importJwk } from "./key-ChfV9C3v.mjs";
9
+ import { c as validateCryptoKey, n as exportJwk, s as importJwk } from "./key-TtgqklZ1.mjs";
10
10
  import { r as normalizeOutgoingActivityJsonLd } from "./outgoing-jsonld-4IJqPYos.mjs";
11
- import { _ as wrapContextLoaderForJsonLd, a as compactJsonLd, c as getNormalizationContextLoader, d as isClearlyMalformedContextReference, f as isInvalidUrlTypeError, l as hasSignature, m as verifyCompactJsonLd, p as signJsonLd, r as assertSafeJsonLd, s as detachSignature, t as InvalidContextReferenceError, u as hasSignatureLike } from "./ld-DBBVabBC.mjs";
12
- import { a as signObject, c as verifyPortableObjectProof, i as hasProofLike, s as verifyObject, t as InvalidPortableObjectIdError, u as verifyPortableObjectProofWithRoot } from "./proof-MFz2960e.mjs";
13
- import { a as listRequestSignatures, c as selectRequestSignature, d as validateMaxSignatures, f as verifyRequest, p as verifyRequestDetailed, s as parseRfc9421SignatureInput } from "./http--IGUT1mg.mjs";
14
- import { t as getAuthenticatedDocumentLoader } from "./docloader-BjJreYQU.mjs";
15
- import { n as kvCache } from "./kv-cache-DFIUR-E5.mjs";
11
+ import { _ as wrapContextLoaderForJsonLd, a as compactJsonLd, c as getNormalizationContextLoader, d as isClearlyMalformedContextReference, f as isInvalidUrlTypeError, l as hasSignature, m as verifyCompactJsonLd, p as signJsonLd, r as assertSafeJsonLd, s as detachSignature, t as InvalidContextReferenceError, u as hasSignatureLike } from "./ld-CHYUee-s.mjs";
12
+ import { a as signObject, c as verifyPortableObjectProof, i as hasProofLike, s as verifyObject, t as InvalidPortableObjectIdError, u as verifyPortableObjectProofWithRoot } from "./proof-B-iLzyva.mjs";
13
+ import { a as listRequestSignatures, c as selectRequestSignature, d as validateMaxSignatures, f as verifyRequest, p as verifyRequestDetailed, s as parseRfc9421SignatureInput } from "./http-DysQjjJe.mjs";
14
+ import { t as getAuthenticatedDocumentLoader } from "./docloader-pjAbs1lc.mjs";
15
+ import { n as kvCache } from "./kv-cache-B7g5Tvl0.mjs";
16
16
  import { d as readBoundedText, l as BodyTooLargeError, t as getNodeInfo, u as MAX_BODY_SIZE } from "./client-CEnNz8O7.mjs";
17
17
  import { t as nodeInfoToJson } from "./types-DE_LV1JB.mjs";
18
- import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-BW5VsXG3.mjs";
19
- import { t as verifyPortableObject } from "./portable-collection-Ct99JsBe.mjs";
20
- import { a as getOrderingDestination, i as sendActivityThroughGateways, n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send-Duj8xys1.mjs";
21
- import { n as FederationBuilderImpl, t as ACTOR_ALIAS_PREFIX } from "./builder-CKAVFvcH.mjs";
18
+ import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-BP_ouAvi.mjs";
19
+ import { t as verifyPortableObject } from "./portable-collection-SqxusPj7.mjs";
20
+ import { a as getOrderingDestination, i as sendActivityThroughGateways, n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send-D0nNms3Q.mjs";
21
+ import { n as FederationBuilderImpl, t as ACTOR_ALIAS_PREFIX } from "./builder-Wx64uCV2.mjs";
22
22
  import { t as CircuitBreaker } from "./circuit-breaker-XJ53md4S.mjs";
23
23
  import { t as buildCollectionSynchronizationHeader } from "./collection-CnnP1UAv.mjs";
24
- import { a as verifyCompoundPortableObjectProofs, i as inspectCompoundPortableObjectApplicability, r as findUnsupportedCompoundProofShape, s as verifyServedPortableObjects, t as containsCompoundPortableObject } from "./compound-proof-BP5SOdXv.mjs";
24
+ import { a as verifyCompoundPortableObjectProofs, i as inspectCompoundPortableObjectApplicability, r as findUnsupportedCompoundProofShape, s as verifyServedPortableObjects, t as containsCompoundPortableObject } from "./compound-proof-B647GUyL.mjs";
25
25
  import { t as KvKeyCache } from "./keycache-Da8A8mZa.mjs";
26
26
  import { t as acceptsJsonLd } from "./negotiation-CCocWT_N.mjs";
27
- import { t as hasMalformedKnownTemporalLiteral } from "./temporal-CVcPKB1N.mjs";
27
+ import { t as hasMalformedKnownTemporalLiteral } from "./temporal-39Ixir8d.mjs";
28
28
  import { t as createExponentialBackoffPolicy } from "./retry-zX5xw5e0.mjs";
29
29
  import { t as TaskCodec } from "./codec-C6rTrpIp.mjs";
30
30
  import { getLogger, withContext } from "@logtape/logtape";
@@ -359,6 +359,180 @@ function serializeDataPointType(dataPointType) {
359
359
  }
360
360
  }
361
361
  //#endregion
362
+ //#region src/federation/compatible-id-warning.ts
363
+ /** Returns a verified first gateway, without dereferencing the actor. */
364
+ async function getLocalFirstGateway(context, ownerId, did) {
365
+ try {
366
+ const parsed = context.parseUri(ownerId, { portable: true });
367
+ if (parsed?.type !== "actor" || parsed.authority !== did) return null;
368
+ return firstGateway(await context.getActor(parsed.identifier), did);
369
+ } catch (error) {
370
+ getLogger([
371
+ "fedify",
372
+ "federation",
373
+ "object"
374
+ ]).debug("Could not check the first gateway of {ownerId}: {error}", {
375
+ ownerId: ownerId.href,
376
+ error
377
+ });
378
+ return null;
379
+ }
380
+ }
381
+ function firstGateway(actor, did) {
382
+ if (actor?.id == null || getPortableDid(actor.id) !== did) return null;
383
+ const gateway = actor.gateway;
384
+ return gateway != null && isGatewayUrl(gateway) ? gateway : null;
385
+ }
386
+ /** Looks for an actor already embedded in the document being published. */
387
+ function getEmbeddedFirstGateway(json, ownerId, did) {
388
+ const owner = getCanonicalPortableId(ownerId);
389
+ if (owner == null) return null;
390
+ return visitJsonMaps(json, (map) => {
391
+ const id = parseMapId(map, isJsonMap(json) ? json : null);
392
+ if (id == null || getCanonicalPortableId(id) !== owner) return;
393
+ const gateways = map.gateways ?? map["https://w3id.org/fep/ef61/gateways"];
394
+ const first = Array.isArray(gateways) ? gateways[0] : isJsonMap(gateways) && Array.isArray(gateways["@list"]) ? gateways["@list"][0] : null;
395
+ const address = typeof first === "string" ? first : isJsonMap(first) ? first.id ?? first["@id"] : null;
396
+ if (typeof address !== "string") return;
397
+ try {
398
+ const gateway = new URL(address);
399
+ if (getPortableDid(id) === did && isGatewayUrl(gateway)) return gateway;
400
+ } catch (error) {
401
+ if (!(error instanceof TypeError)) throw error;
402
+ }
403
+ }) ?? null;
404
+ }
405
+ function isJsonMap(value) {
406
+ return value != null && typeof value === "object" && !Array.isArray(value);
407
+ }
408
+ /** Warns only when the publisher's actual first gateway is known. */
409
+ function warnCompatibleId(id, did, gateway, kind) {
410
+ if (!isCompatibleEf61Iri(id) || getPortableDid(id) !== did || id.origin === gateway.origin) return;
411
+ getLogger([
412
+ "fedify",
413
+ "federation",
414
+ kind === "activity" ? "outbox" : "object"
415
+ ]).warn("The {kind} {id} has an FEP-ef61 compatible identifier on another gateway than its owner's first gateway, {gateway}. FEP-ef61 requires publishers to use the first gateway in the actor's gateways.", {
416
+ kind,
417
+ id: id.href,
418
+ gateway: gateway.origin
419
+ });
420
+ }
421
+ /** Reads the root ID without dereferencing or expanding the document. */
422
+ function getCompactRootId(json) {
423
+ return isJsonMap(json) ? parseMapId(json, json) : null;
424
+ }
425
+ /** Checks an activity and its embedded objects against each one's owner. */
426
+ async function warnCompatibleIdsInJson(json, context) {
427
+ const root = isJsonMap(json) ? json : null;
428
+ const rootOwners = root == null ? [] : ownerIds(root, "actor", root);
429
+ const gateways = /* @__PURE__ */ new Map();
430
+ const maps = [];
431
+ visitJsonMaps(json, (map, path) => {
432
+ maps.push({
433
+ map,
434
+ path
435
+ });
436
+ });
437
+ for (const { map, path } of maps) {
438
+ const id = parseMapId(map, root);
439
+ if (id == null || !isCompatibleEf61Iri(id)) continue;
440
+ const type = map.type ?? map["@type"];
441
+ if ((Array.isArray(type) ? type : [type]).some((t) => typeof t === "string" && /(?:^|[#/:])(CryptographicKey|Multikey|JsonWebKey|Key)$/.test(t))) continue;
442
+ const did = getPortableDid(id);
443
+ if (did == null) continue;
444
+ const owners = path === "" ? rootOwners : [
445
+ ...ownerIds(map, "actor", root),
446
+ ...ownerIds(map, "attributedTo", root),
447
+ ...rootOwners
448
+ ];
449
+ for (const ownerId of owners) {
450
+ if (getPortableDid(ownerId) !== did) continue;
451
+ const key = getCanonicalPortableId(ownerId);
452
+ if (key == null) continue;
453
+ let gateway = gateways.get(key);
454
+ if (gateway === void 0) {
455
+ gateway = getEmbeddedFirstGateway(json, ownerId, did) ?? (context == null ? null : await getLocalFirstGateway(context, ownerId, did));
456
+ gateways.set(key, gateway);
457
+ }
458
+ if (gateway != null) {
459
+ warnCompatibleId(id, did, gateway, path === "" ? "activity" : "object");
460
+ break;
461
+ }
462
+ }
463
+ }
464
+ }
465
+ function ownerIds(map, term, root) {
466
+ const iri = `https://www.w3.org/ns/activitystreams#${term}`;
467
+ const values = [map[term], map[iri]];
468
+ for (const context of [map["@context"], root?.["@context"]]) for (const [alias, definition] of localContextEntries(context)) {
469
+ const mapped = typeof definition === "string" ? definition : isJsonMap(definition) ? definition["@id"] : null;
470
+ if (mapped === iri || mapped === `as:${term}`) values.push(map[alias]);
471
+ }
472
+ return values.flatMap((value) => parseOwnerIds(value, root));
473
+ }
474
+ function localContextEntries(context) {
475
+ if (Array.isArray(context)) return context.flatMap(localContextEntries);
476
+ return isJsonMap(context) ? Object.entries(context) : [];
477
+ }
478
+ function parseOwnerIds(value, root) {
479
+ if (Array.isArray(value)) return value.flatMap((item) => parseOwnerIds(item, root));
480
+ if (isJsonMap(value)) {
481
+ const id = parseMapId(value, root);
482
+ return id == null ? [] : [id];
483
+ }
484
+ if (typeof value !== "string") return [];
485
+ try {
486
+ return [parseIri(value)];
487
+ } catch (error) {
488
+ if (error instanceof TypeError) return [];
489
+ throw error;
490
+ }
491
+ }
492
+ function parseMapId(map, root) {
493
+ let raw = map["@id"] ?? map.id;
494
+ for (const context of [map["@context"], root?.["@context"]]) for (const [alias, definition] of localContextEntries(context)) if ((typeof definition === "string" ? definition : isJsonMap(definition) ? definition["@id"] : null) === "@id" && typeof map[alias] === "string") {
495
+ raw = map[alias];
496
+ break;
497
+ }
498
+ if (typeof raw !== "string") return null;
499
+ try {
500
+ return parseIri(raw);
501
+ } catch (error) {
502
+ if (error instanceof TypeError) return null;
503
+ throw error;
504
+ }
505
+ }
506
+ function visitJsonMaps(json, visit) {
507
+ const seen = /* @__PURE__ */ new Set();
508
+ const pending = [{
509
+ value: json,
510
+ path: ""
511
+ }];
512
+ while (pending.length > 0) {
513
+ const { value, path } = pending.pop();
514
+ if (value == null || typeof value !== "object" || seen.has(value)) continue;
515
+ seen.add(value);
516
+ if (Array.isArray(value)) {
517
+ for (let i = value.length - 1; i >= 0; i--) pending.push({
518
+ value: value[i],
519
+ path: `${path}/${i}`
520
+ });
521
+ continue;
522
+ }
523
+ const map = value;
524
+ const result = visit(map, path);
525
+ if (result !== void 0) return result;
526
+ for (const key of Object.keys(map).reverse()) {
527
+ if (key === "proof" || key === "@context") continue;
528
+ pending.push({
529
+ value: map[key],
530
+ path: `${path}/${key}`
531
+ });
532
+ }
533
+ }
534
+ }
535
+ //#endregion
362
536
  //#region src/federation/inbox.ts
363
537
  async function routeActivity({ context: ctx, json, originalJson, normalizedActivity, ldSignatureVerified, activity, recipient, inboxListeners, inboxContextFactory, listenerInboxContextFactory, inboxErrorHandler, kv, kvPrefixes, queue, span, meterProvider, tracerProvider, idempotencyStrategy }) {
364
538
  const logger = getLogger([
@@ -1202,6 +1376,7 @@ async function handleObject(request, { values, context, objectDispatcher, author
1202
1376
  Vary: "Accept"
1203
1377
  }
1204
1378
  });
1379
+ await warnServedCompatibleObject(context, object, getCompactRootId(jsonLd));
1205
1380
  return new Response(JSON.stringify(jsonLd), { headers: {
1206
1381
  "Content-Type": "application/activity+json",
1207
1382
  Vary: "Accept"
@@ -1305,6 +1480,7 @@ async function handlePortableObject(request, { values, context, objectDispatcher
1305
1480
  return portableObjectInternalServerError(request);
1306
1481
  }
1307
1482
  }
1483
+ if (!tombstone) await warnServedCompatibleObject(context, object, servedId);
1308
1484
  const headers = new Headers({
1309
1485
  "Content-Type": PORTABLE_OBJECT_CONTENT_TYPE,
1310
1486
  Vary: "Accept"
@@ -1315,6 +1491,32 @@ async function handlePortableObject(request, { values, context, objectDispatcher
1315
1491
  headers
1316
1492
  });
1317
1493
  }
1494
+ async function warnServedCompatibleObject(context, object, serializedId) {
1495
+ try {
1496
+ if (isActor(object)) return;
1497
+ const id = typeof serializedId === "string" ? parseIri(serializedId) : serializedId ?? object.id;
1498
+ if (id == null || !isCompatibleEf61Iri(id)) return;
1499
+ const did = getPortableDid(id);
1500
+ if (did == null) return;
1501
+ const ownerIds = object instanceof Activity ? object.actorIds : object.attributionIds;
1502
+ for (const ownerId of ownerIds) {
1503
+ if (getPortableDid(ownerId) !== did) continue;
1504
+ const gateway = await getLocalFirstGateway(context, ownerId, did);
1505
+ if (gateway == null) continue;
1506
+ warnCompatibleId(id, did, gateway, object instanceof Activity ? "activity" : "object");
1507
+ break;
1508
+ }
1509
+ } catch (error) {
1510
+ getLogger([
1511
+ "fedify",
1512
+ "federation",
1513
+ "object"
1514
+ ]).debug("Could not check the first gateway of {objectId}: {error}", {
1515
+ objectId: object.id?.href,
1516
+ error
1517
+ });
1518
+ }
1519
+ }
1318
1520
  function isRequestedPortableObject(object, canonicalId) {
1319
1521
  return object.id != null && getCanonicalPortableId(object.id) === canonicalId;
1320
1522
  }
@@ -1418,13 +1620,13 @@ function recordCollectionMetrics(meterProvider, base, result, options = {}) {
1418
1620
  * @param parameters The parameters for handling the collection.
1419
1621
  * @returns A promise that resolves to an HTTP response.
1420
1622
  */
1421
- async function handleCollection(request, { name: name$2, identifier, uriGetter, filter, filterPredicate, context, collectionCallbacks, portable, tracerProvider, meterProvider, onUnauthorized, onNotFound }) {
1422
- const spanName = name$2.trim().replace(/\s+/g, "_");
1623
+ async function handleCollection(request, { name: name$1, identifier, uriGetter, filter, filterPredicate, context, collectionCallbacks, portable, tracerProvider, meterProvider, onUnauthorized, onNotFound }) {
1624
+ const spanName = name$1.trim().replace(/\s+/g, "_");
1423
1625
  tracerProvider = tracerProvider ?? trace.getTracerProvider();
1424
1626
  const tracer = tracerProvider.getTracer(name, version);
1425
1627
  const cursor = new URL(request.url).searchParams.get("cursor");
1426
1628
  const metricBase = {
1427
- kind: getCollectionMetricKind(name$2),
1629
+ kind: getCollectionMetricKind(name$1),
1428
1630
  page: cursor != null,
1429
1631
  dispatcher: "built_in"
1430
1632
  };
@@ -1470,7 +1672,7 @@ async function handleCollection(request, { name: name$2, identifier, uriGetter,
1470
1672
  span.setStatus({ code: SpanStatusCode.ERROR });
1471
1673
  return await onNotFound(request);
1472
1674
  }
1473
- const items = filterCollectionItems(page.items, name$2, filterPredicate);
1675
+ const items = filterCollectionItems(page.items, name$1, filterPredicate);
1474
1676
  itemCount = items.length;
1475
1677
  span.setAttribute("fedify.collection.items", itemCount);
1476
1678
  return items;
@@ -1512,7 +1714,7 @@ async function handleCollection(request, { name: name$2, identifier, uriGetter,
1512
1714
  } else {
1513
1715
  const uri = new URL(portable == null ? baseUri : pageBase);
1514
1716
  uri.searchParams.set("cursor", cursor);
1515
- const pageOrResponse = await tracer.startActiveSpan(`activitypub.dispatch_collection_page ${name$2}`, {
1717
+ const pageOrResponse = await tracer.startActiveSpan(`activitypub.dispatch_collection_page ${name$1}`, {
1516
1718
  kind: SpanKind.SERVER,
1517
1719
  attributes: {
1518
1720
  "activitypub.collection.id": uri.href,
@@ -1528,7 +1730,7 @@ async function handleCollection(request, { name: name$2, identifier, uriGetter,
1528
1730
  span.setStatus({ code: SpanStatusCode.ERROR });
1529
1731
  return await onNotFound(request);
1530
1732
  }
1531
- const items = filterCollectionItems(page.items, name$2, filterPredicate);
1733
+ const items = filterCollectionItems(page.items, name$1, filterPredicate);
1532
1734
  itemCount = items.length;
1533
1735
  span.setAttribute("fedify.collection.items", itemCount);
1534
1736
  return {
@@ -2719,8 +2921,8 @@ var CustomCollectionHandler = class {
2719
2921
  * @param CollectionPage The CollectionPage constructor.
2720
2922
  * @param filterPredicate Optional filter predicate for items.
2721
2923
  */
2722
- constructor(name$1, values, context, callbacks, tracerProvider = trace.getTracerProvider(), meterProvider, Collection, CollectionPage, filterPredicate, portable) {
2723
- this.name = name$1;
2924
+ constructor(name$2, values, context, callbacks, tracerProvider = trace.getTracerProvider(), meterProvider, Collection, CollectionPage, filterPredicate, portable) {
2925
+ this.name = name$2;
2724
2926
  this.values = values;
2725
2927
  this.context = context;
2726
2928
  this.callbacks = callbacks;
@@ -6057,10 +6259,10 @@ var FederationImpl = class extends FederationBuilderImpl {
6057
6259
  onNotFound
6058
6260
  });
6059
6261
  case "collection": {
6060
- const name = route.name.replace(/^collection:/, "");
6262
+ const name = this.getCollectionName(route.name);
6061
6263
  const callbacks = this.collectionCallbacks[name];
6062
6264
  return await handleCustomCollection(request, {
6063
- name,
6265
+ name: String(name),
6064
6266
  context,
6065
6267
  values: route.values,
6066
6268
  collectionCallbacks: callbacks,
@@ -6071,10 +6273,10 @@ var FederationImpl = class extends FederationBuilderImpl {
6071
6273
  });
6072
6274
  }
6073
6275
  case "orderedCollection": {
6074
- const name = route.name.replace(/^orderedCollection:/, "");
6276
+ const name = this.getCollectionName(route.name);
6075
6277
  const callbacks = this.collectionCallbacks[name];
6076
6278
  return await handleOrderedCollection(request, {
6077
- name,
6279
+ name: String(name),
6078
6280
  context,
6079
6281
  values: route.values,
6080
6282
  collectionCallbacks: callbacks,
@@ -6840,8 +7042,10 @@ var ContextImpl = class ContextImpl {
6840
7042
  const collectionRegex = new RegExp(`^(${["collection", "orderedCollection"].join("|")}):(.*)$`);
6841
7043
  const match = route.name.match(collectionRegex);
6842
7044
  if (match !== null) {
6843
- const [, type, name] = match;
7045
+ const [, type] = match;
7046
+ const name = this.federation.getCollectionName(route.name);
6844
7047
  const cls = this.federation.collectionTypeIds[name];
7048
+ if (cls == null) return null;
6845
7049
  return {
6846
7050
  type,
6847
7051
  name,
@@ -7142,17 +7346,26 @@ var ContextImpl = class ContextImpl {
7142
7346
  activityId: activity.id?.href,
7143
7347
  activity
7144
7348
  });
7349
+ const activityJsonLd = await activity.toJsonLd({
7350
+ format: "compact",
7351
+ contextLoader: this.contextLoader
7352
+ });
7353
+ try {
7354
+ await warnCompatibleIdsInJson(activityJsonLd, this instanceof RequestContextImpl && !this.isInActorDispatcher() ? this : void 0);
7355
+ } catch (error) {
7356
+ logger.debug("Could not check the first gateway of activity {activityId}: {error}", {
7357
+ activityId: activity.id?.href,
7358
+ error
7359
+ });
7360
+ }
7145
7361
  if (this.federation.fanoutQueue == null || options.immediate || options.fanout === "skip" || (options.fanout ?? "auto") === "auto" && globalThis.Object.keys(inboxes).length < FANOUT_THRESHOLD) {
7146
7362
  await this.federation.sendActivity(keys, inboxes, activity, {
7147
7363
  ...opts,
7364
+ activityJsonLd,
7148
7365
  normalizeExistingProofs: proofCreated || options.normalizeExistingProofs
7149
7366
  });
7150
7367
  return true;
7151
7368
  }
7152
- const activityJsonLd = await activity.toJsonLd({
7153
- format: "compact",
7154
- contextLoader: this.contextLoader
7155
- });
7156
7369
  assertSupportedCompoundProofShape(activityJsonLd, activity.id?.href);
7157
7370
  const keyJwkPairs = await Promise.all(keys.map(async ({ keyId, privateKey }) => ({
7158
7371
  keyId: keyId.href,
@@ -7244,7 +7457,7 @@ var ContextImpl = class ContextImpl {
7244
7457
  "inbox"
7245
7458
  ]);
7246
7459
  const contextLoader = options.contextLoader ?? this.contextLoader;
7247
- const json = await activity.toJsonLd({ contextLoader });
7460
+ let json = await activity.toJsonLd({ contextLoader });
7248
7461
  const keyCache = new KvKeyCache(this.federation.kv, this.federation.kvPrefixes.publicKey, {
7249
7462
  documentLoader: this.documentLoader,
7250
7463
  contextLoader: this.contextLoader,
@@ -7306,6 +7519,7 @@ var ContextImpl = class ContextImpl {
7306
7519
  }
7307
7520
  logger.debug("Successfully fetched the remote activity object {activityId}; ignore the original activity and use the fetched one, which is trustworthy.");
7308
7521
  activity = fetched;
7522
+ json = await fetched.toJsonLd({ contextLoader });
7309
7523
  } else logger.debug("Object Integrity Proofs are verified.", {
7310
7524
  recipient,
7311
7525
  activity: json
@@ -7334,6 +7548,10 @@ var RequestContextImpl = class RequestContextImpl extends ContextImpl {
7334
7548
  #invokedFromActorDispatcher;
7335
7549
  #invokedFromObjectDispatcher;
7336
7550
  request;
7551
+ /** Whether a diagnostic actor lookup would re-enter the actor dispatcher. */
7552
+ isInActorDispatcher() {
7553
+ return this.#invokedFromActorDispatcher != null;
7554
+ }
7337
7555
  url = void 0;
7338
7556
  portableRequest;
7339
7557
  constructor(options) {
@@ -7784,4 +8002,4 @@ function getRequestId(request) {
7784
8002
  return `req_${Date.now().toString(36)}${Math.random().toString(36).slice(2, 8)}`;
7785
8003
  }
7786
8004
  //#endregion
7787
- export { handleNodeInfo as C, autoIdAssigner as E, handleBenchmarkTrigger as S, actorDehydrator as T, coversDelivery as _, OutboxContextImpl as a, PORTABLE_OBJECT_CONTENT_TYPE as b, assertPortableActorActivity as c, handleCustomCollection as d, handleInbox as f, respondWithObjectIfAcceptable as g, respondWithObject as h, KvSpecDeterminer as i, handleActor as l, handleOutbox as m, FederationImpl as n, createFederation as o, handleObject as p, InboxContextImpl as r, handleWebFinger as s, ContextImpl as t, handleCollection as u, forwardPortableInboxActivity as v, handleNodeInfoJrd as w, parseHashlinkGatewayRequest as x, resolvePortableInboxForwardingOptions as y };
8005
+ export { getEmbeddedFirstGateway as C, handleNodeInfoJrd as D, handleNodeInfo as E, actorDehydrator as O, getCompactRootId as S, handleBenchmarkTrigger as T, coversDelivery as _, OutboxContextImpl as a, PORTABLE_OBJECT_CONTENT_TYPE as b, assertPortableActorActivity as c, handleCustomCollection as d, handleInbox as f, respondWithObjectIfAcceptable as g, respondWithObject as h, KvSpecDeterminer as i, autoIdAssigner as k, handleActor as l, handleOutbox as m, FederationImpl as n, createFederation as o, handleObject as p, InboxContextImpl as r, handleWebFinger as s, ContextImpl as t, handleCollection as u, forwardPortableInboxActivity as v, warnCompatibleIdsInJson as w, parseHashlinkGatewayRequest as x, resolvePortableInboxForwardingOptions as y };
@@ -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-BW7-tHAG.mjs";
4
+ import { n as FederationImpl } from "./middleware-DoAk0Q3s.mjs";
5
5
  export { FederationImpl };
@@ -1,6 +1,6 @@
1
1
  /// <reference lib="esnext.temporal" />
2
2
  import { n as HttpMessageSignaturesSpecDeterminer } from "./http-DGx0KOws.js";
3
- import { n as KvStore, t as KvKey } from "./kv-BhNbN8Ed.js";
3
+ import { n as KvStore, t as KvKey } from "./kv-B2mzK5tl.js";
4
4
  import { t as DocumentFetchKind } from "./metrics-DoRtI0qU.js";
5
5
  import { MeterProvider, TracerProvider } from "@opentelemetry/api";
6
6
  import { DocumentLoader, DocumentLoaderFactoryOptions } from "@fedify/vocab-runtime";
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { Jt as WebFingerLinksDispatcher, St as ActorHandleMapper, bt as ActorAliasMapper, p as RequestContext, xt as ActorDispatcher } from "./context-DMd11IAu.js";
2
+ import { Jt as WebFingerLinksDispatcher, St as ActorHandleMapper, bt as ActorAliasMapper, p as RequestContext, xt as ActorDispatcher } from "./context-CtI307_A.js";
3
3
  import { RouterError, RouterOptions, RouterRouteResult } from "@fedify/uri-template";
4
4
  import { MeterProvider, Span, Tracer } from "@opentelemetry/api";
5
5
 
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { Jt as WebFingerLinksDispatcher, St as ActorHandleMapper, bt as ActorAliasMapper, p as RequestContext, xt as ActorDispatcher } from "./context-Bl_Y7T_3.cjs";
2
+ import { Jt as WebFingerLinksDispatcher, St as ActorHandleMapper, bt as ActorAliasMapper, p as RequestContext, xt as ActorDispatcher } from "./context-B6X-t8gI.cjs";
3
3
  import { MeterProvider, Span, Tracer } from "@opentelemetry/api";
4
4
  import { RouterError, RouterOptions, RouterRouteResult } from "@fedify/uri-template";
5
5
 
@@ -1,6 +1,6 @@
1
1
  /// <reference lib="esnext.temporal" />
2
2
  import { n as HttpMessageSignaturesSpecDeterminer } from "./http-BrwKINQn.cjs";
3
- import { n as KvStore, t as KvKey } from "./kv-BhNbN8Ed.cjs";
3
+ import { n as KvStore, t as KvKey } from "./kv-B2mzK5tl.cjs";
4
4
  import { t as DocumentFetchKind } from "./metrics-DVKYY6K1.cjs";
5
5
  import { DocumentLoader, DocumentLoaderFactoryOptions } from "@fedify/vocab-runtime";
6
6
  import { MeterProvider, TracerProvider } from "@opentelemetry/api";
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-ByBlnY3D.cjs");
7
- const require_federation = require("./federation-B-0EXZPH.cjs");
6
+ const require_http = require("./http-DC5DyShJ.cjs");
7
+ const require_federation = require("./federation-DiycMKQx.cjs");
8
8
  const require_types = require("./types-poIao40f.cjs");
9
- const require_portable_collection = require("./portable-collection-CXcAlwei.cjs");
10
- const require_kv_cache = require("./kv-cache-BDwUzxBJ.cjs");
9
+ const require_portable_collection = require("./portable-collection-Cz9K1Tas.cjs");
10
+ const require_kv_cache = require("./kv-cache-CsNDrjVT.cjs");
11
11
  require("./nodeinfo/mod.cjs");
12
12
  require("./runtime/mod.cjs");
13
13
  require("./sig/mod.cjs");
package/dist/mod.d.cts CHANGED
@@ -2,12 +2,12 @@
2
2
  import { a as InboundService, c as OutboundService, d as Software, f as Usage, i as parseNodeInfo, l as Protocol, n as ParseNodeInfoOptions, o as JsonValue, p as nodeInfoToJson, r as getNodeInfo, s as NodeInfo, t as GetNodeInfoOptions, u as Services } from "./client-D-XP_Ccb.cjs";
3
3
  import { C as exportJwk, D as importJwk, E as generateCryptoKeyPair, S as KeyCache, T as fetchKeyDetailed, _ as validateAcceptSignature, a as VerifyRequestDetailedResult, b as FetchKeyOptions, c as signRequest, d as AcceptSignatureMember, f as AcceptSignatureParameters, g as parseAcceptSignature, h as fulfillAcceptSignature, i as SignRequestOptions, l as verifyRequest, m as formatAcceptSignature, n as HttpMessageSignaturesSpecDeterminer, o as VerifyRequestFailureReason, p as FulfillAcceptSignatureResult, r as Rfc9421SignRequestOptions, s as VerifyRequestOptions, t as HttpMessageSignaturesSpec, u as verifyRequestDetailed, v as FetchKeyDetailedResult, w as fetchKey, x as FetchKeyResult, y as FetchKeyErrorResult } from "./http-BrwKINQn.cjs";
4
4
  import { i as getKeyOwner, n as GetKeyOwnerOptions, r as doesActorOwnKey, t as DoesActorOwnKeyOptions } from "./owner-BF0L9cMt.cjs";
5
- import { $ as respondWithObject, $t as digest, A as InboxChallengePolicy, At as CustomCollectionDispatcher, B as createFederation, Bt as OutboxListener, C as FederationBenchmarkOptions, Ct as ActorKeyPairsDispatcher, D as FederationStartQueueOptions, Dt as CollectionDispatcher, E as FederationOptions, Et as CollectionCursor, F as PortableInboxForwardingOptions, Ft as MediaUploaderCallback, G as TaskEnqueueOptions, Gt as SharedInboxKeyDispatcher, H as createFederationBuilder, Ht as OutboxPermanentFailureHandler, I as Rfc6570Expression, It as NodeInfoDispatcher, J as CreateExponentialBackoffPolicyOptions, Jt as WebFingerLinksDispatcher, K as TaskHandler, Kt as UnverifiedActivityHandler, L as FederationKvPrefixes, Lt as ObjectAuthorizePredicate, M as MediaUploaderSetters, Mt as HashlinkMediaRequest, N as ObjectCallbackSetters, Nt as InboxErrorHandler, O as IdempotencyKeyCallback, Ot as CustomCollectionCounter, P as OutboxListenerSetters, Pt as InboxListener, Q as RespondWithObjectOptions, Qt as buildCollectionSynchronizationHeader, R as FederationOrigin, Rt as ObjectDispatcher, S as Federation, St as ActorHandleMapper, T as FederationFetchOptions, Tt as CollectionCounter, U as TaskDefinition, Ut as PortableActorIdMapper, V as Message, Vt as OutboxListenerErrorHandler, W as TaskDefinitionOptions, Wt as PortableCollectionOwnerMapper, X as RetryPolicy, Xt as SenderKeyPair, Y as RetryContext, Yt as SendActivityError, Z as createExponentialBackoffPolicy, Zt as PageItems, _ as ActorCallbackSetters, _t as NormalizedCircuitBreakerOptions, a as GetObjectOptions, at as MessageQueueEnqueueOptions, b as CustomCollectionCallbackSetters, bt as ActorAliasMapper, c as IsSignedByAudienceOptions, ct as CircuitBreaker, d as ParseUriResult, dt as CircuitBreakerCreateOptions, en as ActivityTransformer, et as respondWithObjectIfAcceptable, f as PortableRequest, ft as CircuitBreakerFailurePolicy, g as SendActivityOptionsForCollection, gt as CircuitBreakerStateChange, h as SendActivityOptions, ht as CircuitBreakerState, i as GetActorOptions, it as MessageQueueDepth, j as InboxListenerSetters, jt as HashlinkMediaDispatcher, k as IdempotencyStrategy, kt as CustomCollectionCursor, l as OutboxContext, lt as CircuitBreakerActivityDrop, m as RouteActivityOptions, mt as CircuitBreakerOptions, n as Context, nt as InProcessMessageQueueOptions, o as GetSignedKeyOptions, ot as MessageQueueListenOptions, p as RequestContext, pt as CircuitBreakerKvState, q as TaskRegistry, qt as UnverifiedActivityReason, r as ForwardActivityOptions, rt as MessageQueue, s as InboxContext, st as ParallelMessageQueue, t as ActorKeyPair, tt as InProcessMessageQueue, u as ParseUriOptions, ut as CircuitBreakerBeforeSendDecision, v as CollectionCallbackSetters, vt as normalizeCircuitBreakerOptions, w as FederationBuilder, wt as AuthorizePredicate, x as Federatable, xt as ActorDispatcher, y as ConstructorWithTypeId, yt as parseCircuitBreakerKvState, z as FederationQueueOptions, zt as OutboxErrorHandler } from "./context-Bl_Y7T_3.cjs";
6
- import { a as MemoryKvStore, i as KvStoreSetOptions, n as KvStore, r as KvStoreListEntry, t as KvKey } from "./kv-BhNbN8Ed.cjs";
5
+ import { $ as respondWithObject, $t as digest, A as InboxChallengePolicy, At as CustomCollectionDispatcher, B as createFederation, Bt as OutboxListener, C as FederationBenchmarkOptions, Ct as ActorKeyPairsDispatcher, D as FederationStartQueueOptions, Dt as CollectionDispatcher, E as FederationOptions, Et as CollectionCursor, F as PortableInboxForwardingOptions, Ft as MediaUploaderCallback, G as TaskEnqueueOptions, Gt as SharedInboxKeyDispatcher, H as createFederationBuilder, Ht as OutboxPermanentFailureHandler, I as Rfc6570Expression, It as NodeInfoDispatcher, J as CreateExponentialBackoffPolicyOptions, Jt as WebFingerLinksDispatcher, K as TaskHandler, Kt as UnverifiedActivityHandler, L as FederationKvPrefixes, Lt as ObjectAuthorizePredicate, M as MediaUploaderSetters, Mt as HashlinkMediaRequest, N as ObjectCallbackSetters, Nt as InboxErrorHandler, O as IdempotencyKeyCallback, Ot as CustomCollectionCounter, P as OutboxListenerSetters, Pt as InboxListener, Q as RespondWithObjectOptions, Qt as buildCollectionSynchronizationHeader, R as FederationOrigin, Rt as ObjectDispatcher, S as Federation, St as ActorHandleMapper, T as FederationFetchOptions, Tt as CollectionCounter, U as TaskDefinition, Ut as PortableActorIdMapper, V as Message, Vt as OutboxListenerErrorHandler, W as TaskDefinitionOptions, Wt as PortableCollectionOwnerMapper, X as RetryPolicy, Xt as SenderKeyPair, Y as RetryContext, Yt as SendActivityError, Z as createExponentialBackoffPolicy, Zt as PageItems, _ as ActorCallbackSetters, _t as NormalizedCircuitBreakerOptions, a as GetObjectOptions, at as MessageQueueEnqueueOptions, b as CustomCollectionCallbackSetters, bt as ActorAliasMapper, c as IsSignedByAudienceOptions, ct as CircuitBreaker, d as ParseUriResult, dt as CircuitBreakerCreateOptions, en as ActivityTransformer, et as respondWithObjectIfAcceptable, f as PortableRequest, ft as CircuitBreakerFailurePolicy, g as SendActivityOptionsForCollection, gt as CircuitBreakerStateChange, h as SendActivityOptions, ht as CircuitBreakerState, i as GetActorOptions, it as MessageQueueDepth, j as InboxListenerSetters, jt as HashlinkMediaDispatcher, k as IdempotencyStrategy, kt as CustomCollectionCursor, l as OutboxContext, lt as CircuitBreakerActivityDrop, m as RouteActivityOptions, mt as CircuitBreakerOptions, n as Context, nt as InProcessMessageQueueOptions, o as GetSignedKeyOptions, ot as MessageQueueListenOptions, p as RequestContext, pt as CircuitBreakerKvState, q as TaskRegistry, qt as UnverifiedActivityReason, r as ForwardActivityOptions, rt as MessageQueue, s as InboxContext, st as ParallelMessageQueue, t as ActorKeyPair, tt as InProcessMessageQueue, u as ParseUriOptions, ut as CircuitBreakerBeforeSendDecision, v as CollectionCallbackSetters, vt as normalizeCircuitBreakerOptions, w as FederationBuilder, wt as AuthorizePredicate, x as Federatable, xt as ActorDispatcher, y as ConstructorWithTypeId, yt as parseCircuitBreakerKvState, z as FederationQueueOptions, zt as OutboxErrorHandler } from "./context-B6X-t8gI.cjs";
6
+ import { a as MemoryKvStore, i as KvStoreSetOptions, n as KvStore, r as KvStoreListEntry, t as KvKey } from "./kv-B2mzK5tl.cjs";
7
7
  import { actorDehydrator, autoIdAssigner, getDefaultActivityTransformers } from "./compat/mod.cjs";
8
- import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "./mod-Cyy1Wahy.cjs";
8
+ import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "./mod-C7_2j7VT.cjs";
9
9
  import { C as createSignature, D as verifyJsonLd, E as signJsonLd, O as verifySignature, S as attachSignature, T as hasSignatureLike, _ as verifyProof, a as CreateProofOptions, b as VerifyJsonLdOptions, c as VerifyPortableObjectProofFailureReason, d as VerifyProofOptions, f as createProof, g as verifyPortableObjectProof, h as verifyObject, i as verifyPortableObject, l as VerifyPortableObjectProofOptions, m as signObject, n as VerifyPortableObjectOptions, o as SignObjectOptions, p as hasProofLike, r as VerifyPortableObjectResult, s as VerifyObjectOptions, t as VerifyPortableObjectFailureReason, u as VerifyPortableObjectProofResult, v as CreateSignatureOptions, w as detachSignature, x as VerifySignatureOptions, y as SignJsonLdOptions } from "./mod-DoTWIc7F.cjs";
10
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./mod-Dp3Ij7sw.cjs";
10
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./mod-DFL6IxYQ.cjs";
11
11
  export * from "@fedify/vocab-runtime";
12
12
 
13
13
  //#region src/mod.d.ts
package/dist/mod.d.ts CHANGED
@@ -2,12 +2,12 @@
2
2
  import { a as InboundService, c as OutboundService, d as Software, f as Usage, i as parseNodeInfo, l as Protocol, n as ParseNodeInfoOptions, o as JsonValue, p as nodeInfoToJson, r as getNodeInfo, s as NodeInfo, t as GetNodeInfoOptions, u as Services } from "./client-D-XP_Ccb.js";
3
3
  import { C as exportJwk, D as importJwk, E as generateCryptoKeyPair, S as KeyCache, T as fetchKeyDetailed, _ as validateAcceptSignature, a as VerifyRequestDetailedResult, b as FetchKeyOptions, c as signRequest, d as AcceptSignatureMember, f as AcceptSignatureParameters, g as parseAcceptSignature, h as fulfillAcceptSignature, i as SignRequestOptions, l as verifyRequest, m as formatAcceptSignature, n as HttpMessageSignaturesSpecDeterminer, o as VerifyRequestFailureReason, p as FulfillAcceptSignatureResult, r as Rfc9421SignRequestOptions, s as VerifyRequestOptions, t as HttpMessageSignaturesSpec, u as verifyRequestDetailed, v as FetchKeyDetailedResult, w as fetchKey, x as FetchKeyResult, y as FetchKeyErrorResult } from "./http-DGx0KOws.js";
4
4
  import { i as getKeyOwner, n as GetKeyOwnerOptions, r as doesActorOwnKey, t as DoesActorOwnKeyOptions } from "./owner-BSzr5-I8.js";
5
- import { $ as respondWithObject, $t as digest, A as InboxChallengePolicy, At as CustomCollectionDispatcher, B as createFederation, Bt as OutboxListener, C as FederationBenchmarkOptions, Ct as ActorKeyPairsDispatcher, D as FederationStartQueueOptions, Dt as CollectionDispatcher, E as FederationOptions, Et as CollectionCursor, F as PortableInboxForwardingOptions, Ft as MediaUploaderCallback, G as TaskEnqueueOptions, Gt as SharedInboxKeyDispatcher, H as createFederationBuilder, Ht as OutboxPermanentFailureHandler, I as Rfc6570Expression, It as NodeInfoDispatcher, J as CreateExponentialBackoffPolicyOptions, Jt as WebFingerLinksDispatcher, K as TaskHandler, Kt as UnverifiedActivityHandler, L as FederationKvPrefixes, Lt as ObjectAuthorizePredicate, M as MediaUploaderSetters, Mt as HashlinkMediaRequest, N as ObjectCallbackSetters, Nt as InboxErrorHandler, O as IdempotencyKeyCallback, Ot as CustomCollectionCounter, P as OutboxListenerSetters, Pt as InboxListener, Q as RespondWithObjectOptions, Qt as buildCollectionSynchronizationHeader, R as FederationOrigin, Rt as ObjectDispatcher, S as Federation, St as ActorHandleMapper, T as FederationFetchOptions, Tt as CollectionCounter, U as TaskDefinition, Ut as PortableActorIdMapper, V as Message, Vt as OutboxListenerErrorHandler, W as TaskDefinitionOptions, Wt as PortableCollectionOwnerMapper, X as RetryPolicy, Xt as SenderKeyPair, Y as RetryContext, Yt as SendActivityError, Z as createExponentialBackoffPolicy, Zt as PageItems, _ as ActorCallbackSetters, _t as NormalizedCircuitBreakerOptions, a as GetObjectOptions, at as MessageQueueEnqueueOptions, b as CustomCollectionCallbackSetters, bt as ActorAliasMapper, c as IsSignedByAudienceOptions, ct as CircuitBreaker, d as ParseUriResult, dt as CircuitBreakerCreateOptions, en as ActivityTransformer, et as respondWithObjectIfAcceptable, f as PortableRequest, ft as CircuitBreakerFailurePolicy, g as SendActivityOptionsForCollection, gt as CircuitBreakerStateChange, h as SendActivityOptions, ht as CircuitBreakerState, i as GetActorOptions, it as MessageQueueDepth, j as InboxListenerSetters, jt as HashlinkMediaDispatcher, k as IdempotencyStrategy, kt as CustomCollectionCursor, l as OutboxContext, lt as CircuitBreakerActivityDrop, m as RouteActivityOptions, mt as CircuitBreakerOptions, n as Context, nt as InProcessMessageQueueOptions, o as GetSignedKeyOptions, ot as MessageQueueListenOptions, p as RequestContext, pt as CircuitBreakerKvState, q as TaskRegistry, qt as UnverifiedActivityReason, r as ForwardActivityOptions, rt as MessageQueue, s as InboxContext, st as ParallelMessageQueue, t as ActorKeyPair, tt as InProcessMessageQueue, u as ParseUriOptions, ut as CircuitBreakerBeforeSendDecision, v as CollectionCallbackSetters, vt as normalizeCircuitBreakerOptions, w as FederationBuilder, wt as AuthorizePredicate, x as Federatable, xt as ActorDispatcher, y as ConstructorWithTypeId, yt as parseCircuitBreakerKvState, z as FederationQueueOptions, zt as OutboxErrorHandler } from "./context-DMd11IAu.js";
6
- import { a as MemoryKvStore, i as KvStoreSetOptions, n as KvStore, r as KvStoreListEntry, t as KvKey } from "./kv-BhNbN8Ed.js";
5
+ import { $ as respondWithObject, $t as digest, A as InboxChallengePolicy, At as CustomCollectionDispatcher, B as createFederation, Bt as OutboxListener, C as FederationBenchmarkOptions, Ct as ActorKeyPairsDispatcher, D as FederationStartQueueOptions, Dt as CollectionDispatcher, E as FederationOptions, Et as CollectionCursor, F as PortableInboxForwardingOptions, Ft as MediaUploaderCallback, G as TaskEnqueueOptions, Gt as SharedInboxKeyDispatcher, H as createFederationBuilder, Ht as OutboxPermanentFailureHandler, I as Rfc6570Expression, It as NodeInfoDispatcher, J as CreateExponentialBackoffPolicyOptions, Jt as WebFingerLinksDispatcher, K as TaskHandler, Kt as UnverifiedActivityHandler, L as FederationKvPrefixes, Lt as ObjectAuthorizePredicate, M as MediaUploaderSetters, Mt as HashlinkMediaRequest, N as ObjectCallbackSetters, Nt as InboxErrorHandler, O as IdempotencyKeyCallback, Ot as CustomCollectionCounter, P as OutboxListenerSetters, Pt as InboxListener, Q as RespondWithObjectOptions, Qt as buildCollectionSynchronizationHeader, R as FederationOrigin, Rt as ObjectDispatcher, S as Federation, St as ActorHandleMapper, T as FederationFetchOptions, Tt as CollectionCounter, U as TaskDefinition, Ut as PortableActorIdMapper, V as Message, Vt as OutboxListenerErrorHandler, W as TaskDefinitionOptions, Wt as PortableCollectionOwnerMapper, X as RetryPolicy, Xt as SenderKeyPair, Y as RetryContext, Yt as SendActivityError, Z as createExponentialBackoffPolicy, Zt as PageItems, _ as ActorCallbackSetters, _t as NormalizedCircuitBreakerOptions, a as GetObjectOptions, at as MessageQueueEnqueueOptions, b as CustomCollectionCallbackSetters, bt as ActorAliasMapper, c as IsSignedByAudienceOptions, ct as CircuitBreaker, d as ParseUriResult, dt as CircuitBreakerCreateOptions, en as ActivityTransformer, et as respondWithObjectIfAcceptable, f as PortableRequest, ft as CircuitBreakerFailurePolicy, g as SendActivityOptionsForCollection, gt as CircuitBreakerStateChange, h as SendActivityOptions, ht as CircuitBreakerState, i as GetActorOptions, it as MessageQueueDepth, j as InboxListenerSetters, jt as HashlinkMediaDispatcher, k as IdempotencyStrategy, kt as CustomCollectionCursor, l as OutboxContext, lt as CircuitBreakerActivityDrop, m as RouteActivityOptions, mt as CircuitBreakerOptions, n as Context, nt as InProcessMessageQueueOptions, o as GetSignedKeyOptions, ot as MessageQueueListenOptions, p as RequestContext, pt as CircuitBreakerKvState, q as TaskRegistry, qt as UnverifiedActivityReason, r as ForwardActivityOptions, rt as MessageQueue, s as InboxContext, st as ParallelMessageQueue, t as ActorKeyPair, tt as InProcessMessageQueue, u as ParseUriOptions, ut as CircuitBreakerBeforeSendDecision, v as CollectionCallbackSetters, vt as normalizeCircuitBreakerOptions, w as FederationBuilder, wt as AuthorizePredicate, x as Federatable, xt as ActorDispatcher, y as ConstructorWithTypeId, yt as parseCircuitBreakerKvState, z as FederationQueueOptions, zt as OutboxErrorHandler } from "./context-CtI307_A.js";
6
+ import { a as MemoryKvStore, i as KvStoreSetOptions, n as KvStore, r as KvStoreListEntry, t as KvKey } from "./kv-B2mzK5tl.js";
7
7
  import { actorDehydrator, autoIdAssigner, getDefaultActivityTransformers } from "./compat/mod.js";
8
- import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "./mod-BVNGHgVr.js";
8
+ import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "./mod-BhTaDR5H.js";
9
9
  import { C as createSignature, D as verifyJsonLd, E as signJsonLd, O as verifySignature, S as attachSignature, T as hasSignatureLike, _ as verifyProof, a as CreateProofOptions, b as VerifyJsonLdOptions, c as VerifyPortableObjectProofFailureReason, d as VerifyProofOptions, f as createProof, g as verifyPortableObjectProof, h as verifyObject, i as verifyPortableObject, l as VerifyPortableObjectProofOptions, m as signObject, n as VerifyPortableObjectOptions, o as SignObjectOptions, p as hasProofLike, r as VerifyPortableObjectResult, s as VerifyObjectOptions, t as VerifyPortableObjectFailureReason, u as VerifyPortableObjectProofResult, v as CreateSignatureOptions, w as detachSignature, x as VerifySignatureOptions, y as SignJsonLdOptions } from "./mod-Cy9VNHVw.js";
10
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./mod-C5Mwx5ty.js";
10
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./mod-B8MI1mpi.js";
11
11
  export * from "@fedify/vocab-runtime";
12
12
 
13
13
  //#region src/mod.d.ts
package/dist/mod.js CHANGED
@@ -3,11 +3,11 @@ import { URLPattern } from "urlpattern-polyfill";
3
3
  import "./rolldown-runtime-BC-Eo5Mj.js";
4
4
  import { n as autoIdAssigner, r as getDefaultActivityTransformers, t as actorDehydrator } from "./transformers-DAtXl_Kc.js";
5
5
  import "./compat/mod.js";
6
- import { D as createSignature, H as fetchKeyDetailed, I as verifyJsonLd, L as verifySignature, O as detachSignature, P as signJsonLd, T as attachSignature, U as generateCryptoKeyPair, V as fetchKey, W as importJwk, _ as verifyObject, _t as validateAcceptSignature, a as signRequest, c as verifyRequestDetailed, gt as parseAcceptSignature, h as signObject, ht as fulfillAcceptSignature, j as hasSignatureLike, m as hasProofLike, mt as formatAcceptSignature, p as createProof, s as verifyRequest, v as verifyPortableObjectProof, x as verifyProof, z as exportJwk } from "./http-Di8yiDMY.js";
7
- import { a as respondWithObjectIfAcceptable, c as digest, d as parseCircuitBreakerKvState, f as createFederationBuilder, i as respondWithObject, l as CircuitBreaker, n as handleWebFinger, o as SendActivityError, r as createExponentialBackoffPolicy, s as buildCollectionSynchronizationHeader, t as createFederation, u as normalizeCircuitBreakerOptions } from "./middleware-VXGLiHtY.js";
6
+ import { D as createSignature, H as fetchKeyDetailed, I as verifyJsonLd, L as verifySignature, O as detachSignature, P as signJsonLd, T as attachSignature, U as generateCryptoKeyPair, V as fetchKey, W as importJwk, _ as verifyObject, _t as validateAcceptSignature, a as signRequest, c as verifyRequestDetailed, gt as parseAcceptSignature, h as signObject, ht as fulfillAcceptSignature, j as hasSignatureLike, m as hasProofLike, mt as formatAcceptSignature, p as createProof, s as verifyRequest, v as verifyPortableObjectProof, x as verifyProof, z as exportJwk } from "./http-CHqz_Jp6.js";
7
+ import { a as respondWithObjectIfAcceptable, c as digest, d as parseCircuitBreakerKvState, f as createFederationBuilder, i as respondWithObject, l as CircuitBreaker, n as handleWebFinger, o as SendActivityError, r as createExponentialBackoffPolicy, s as buildCollectionSynchronizationHeader, t as createFederation, u as normalizeCircuitBreakerOptions } from "./middleware-D2scpP9Q.js";
8
8
  import { n as getNodeInfo, r as parseNodeInfo, t as nodeInfoToJson } from "./types-_S2_MeLF.js";
9
- import { n as doesActorOwnKey, r as getKeyOwner, t as verifyPortableObject } from "./portable-collection-FTPa5D91.js";
10
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-DpwDPt9V.js";
9
+ import { n as doesActorOwnKey, r as getKeyOwner, t as verifyPortableObject } from "./portable-collection-4SnmDcTc.js";
10
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-CgYK8siN.js";
11
11
  import { InProcessMessageQueue, MemoryKvStore, ParallelMessageQueue, Router, RouterError } from "./federation/mod.js";
12
12
  import "./nodeinfo/mod.js";
13
13
  import "./runtime/mod.js";
@@ -5,7 +5,7 @@ import { r as createRequestContext } from "../context-8Tu9kea0.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 { C as handleNodeInfo, o as createFederation, w as handleNodeInfoJrd } from "../middleware-BW7-tHAG.mjs";
8
+ import { D as handleNodeInfoJrd, E as handleNodeInfo, o as createFederation } from "../middleware-DoAk0Q3s.mjs";
9
9
  import { test } from "@fedify/fixture";
10
10
  //#region src/nodeinfo/handler.test.ts
11
11
  test("handleNodeInfo()", async () => {
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { n as KvStore, t as KvKey } from "../kv-BhNbN8Ed.cjs";
2
+ import { n as KvStore, t as KvKey } from "../kv-B2mzK5tl.cjs";
3
3
  import { ReadableSpan, SpanExporter } from "@opentelemetry/sdk-trace-base";
4
4
  import { ExportResultCode } from "@opentelemetry/core";
5
5
 
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { n as KvStore, t as KvKey } from "../kv-BhNbN8Ed.js";
2
+ import { n as KvStore, t as KvKey } from "../kv-B2mzK5tl.js";
3
3
  import { ExportResultCode } from "@opentelemetry/core";
4
4
  import { ReadableSpan, SpanExporter } from "@opentelemetry/sdk-trace-base";
5
5
 
@@ -2,10 +2,10 @@ import "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { d as isPortableUri, l as isPortableId, n as getCanonicalPortableId, p as isSamePublicKey$1, s as isCompatibleKeyId } from "./portable-key-id-Ca30-hOa.mjs";
5
- import { n as version, t as name } from "./deno-BKp9fYB3.mjs";
5
+ import { n as version, t as name } from "./deno-9flirCWb.mjs";
6
6
  import { i as parseKeyOwnerEvidence, r as getVerifiedKeyOwnerEvidence } from "./key-owner-evidence-APB6NpSk.mjs";
7
- import { l as verifyKeyOwnership, n as exportJwk, r as fetchActorDocument } from "./key-ChfV9C3v.mjs";
8
- import { n as resolvePortableActorKey, t as fetchPortableGatewayKey } from "./portable-key-U3lW06QJ.mjs";
7
+ import { l as verifyKeyOwnership, n as exportJwk, r as fetchActorDocument } from "./key-TtgqklZ1.mjs";
8
+ import { n as resolvePortableActorKey, t as fetchPortableGatewayKey } from "./portable-key-DYr6MZUl.mjs";
9
9
  import { getLogger } from "@logtape/logtape";
10
10
  import { CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
11
11
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "temporal-polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { At as name, B as fetchActorDocument, Dt as isPortableUri, J as getVerifiedKeyOwnerEvidence, K as verifyKeyOwnership, Tt as isPortableId, Y as parseKeyOwnerEvidence, b as verifyPortableObjectProofWithRoot, jt as version, kt as isSamePublicKey$1, l as fetchPortableGatewayKey, u as resolvePortableActorKey, v as verifyPortableObjectProof, wt as isCompatibleKeyId, yt as getCanonicalPortableId, z as exportJwk } from "./http-Di8yiDMY.js";
3
+ import { At as name, B as fetchActorDocument, Dt as isPortableUri, J as getVerifiedKeyOwnerEvidence, K as verifyKeyOwnership, Tt as isPortableId, Y as parseKeyOwnerEvidence, b as verifyPortableObjectProofWithRoot, jt as version, kt as isSamePublicKey$1, l as fetchPortableGatewayKey, u as resolvePortableActorKey, v as verifyPortableObjectProof, wt as isCompatibleKeyId, yt as getCanonicalPortableId, z as exportJwk } from "./http-CHqz_Jp6.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
  import { CollectionPage, CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
6
6
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";