@fedify/fedify 2.3.0-dev.1114 → 2.3.0-dev.1119

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 (45) hide show
  1. package/dist/{builder-YlEusQth.mjs → builder-Ond_h57y.mjs} +2 -2
  2. package/dist/compat/transformers.test.mjs +1 -1
  3. package/dist/{deno-CF3jMgip.mjs → deno-DVsHS7rA.mjs} +1 -1
  4. package/dist/{docloader-BENj6vQ4.mjs → docloader-WsWfKaE5.mjs} +2 -2
  5. package/dist/federation/builder.test.mjs +1 -1
  6. package/dist/federation/handler.test.mjs +2 -2
  7. package/dist/federation/idempotency.test.mjs +2 -2
  8. package/dist/federation/metrics.test.d.mts +2 -0
  9. package/dist/federation/metrics.test.mjs +107 -0
  10. package/dist/federation/middleware.test.mjs +386 -6
  11. package/dist/federation/mod.cjs +1 -1
  12. package/dist/federation/mod.js +1 -1
  13. package/dist/federation/send.test.mjs +3 -3
  14. package/dist/federation/webfinger.test.mjs +1 -1
  15. package/dist/{http-CpzZ9zsb.js → http-CouJSFVK.js} +73 -5
  16. package/dist/{http-CKCgOPkX.cjs → http-CubOB9wq.cjs} +90 -4
  17. package/dist/{http-BmOZYc-8.mjs → http-DUV8ysti.mjs} +3 -3
  18. package/dist/{key-B4I8H5Lc.mjs → key-BoWaYRHm.mjs} +1 -1
  19. package/dist/{kv-cache-Wc5ezcVW.js → kv-cache-DBNpsneh.js} +1 -1
  20. package/dist/{kv-cache-DY-XWOqM.cjs → kv-cache-Dz31ATUT.cjs} +1 -1
  21. package/dist/{ld-B5D5THhl.mjs → ld-B5K1mSuG.mjs} +3 -3
  22. package/dist/{metrics-ek3ilf6c.mjs → metrics-C4attqv0.mjs} +73 -5
  23. package/dist/{middleware-EI7OU6BR.mjs → middleware-BDKFRjue.mjs} +1 -1
  24. package/dist/{middleware-EqTYPG4F.cjs → middleware-CmsDtIHI.cjs} +33 -14
  25. package/dist/{middleware-CuZbBw-N.js → middleware-Dtjz-hSk.js} +33 -14
  26. package/dist/{middleware-DlcecZMq.mjs → middleware-t0jC8I99.mjs} +40 -21
  27. package/dist/mod.cjs +4 -4
  28. package/dist/mod.js +4 -4
  29. package/dist/nodeinfo/handler.test.mjs +1 -1
  30. package/dist/{owner-DO810N24.mjs → owner-hDxI0ufu.mjs} +2 -2
  31. package/dist/{proof-DIoqrKnX.cjs → proof-BUWfVr6Q.cjs} +1 -1
  32. package/dist/{proof-BgfyWv7b.mjs → proof-DhVuz4bc.mjs} +3 -3
  33. package/dist/{proof-Vd8-1EWh.js → proof-n60t8o9P.js} +1 -1
  34. package/dist/{send-CAYXdUTk.mjs → send-BPhyR5Oo.mjs} +3 -3
  35. package/dist/sig/http.test.mjs +2 -2
  36. package/dist/sig/key.test.mjs +1 -1
  37. package/dist/sig/ld.test.mjs +2 -2
  38. package/dist/sig/mod.cjs +2 -2
  39. package/dist/sig/mod.js +2 -2
  40. package/dist/sig/owner.test.mjs +1 -1
  41. package/dist/sig/proof.test.mjs +1 -1
  42. package/dist/utils/docloader.test.mjs +2 -2
  43. package/dist/utils/mod.cjs +1 -1
  44. package/dist/utils/mod.js +1 -1
  45. package/package.json +5 -5
@@ -2,10 +2,10 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
3
  import { t as __exportAll } from "./chunk-CRNNMoPX.js";
4
4
  import { r as getDefaultActivityTransformers } from "./transformers-BGMIq1cs.js";
5
- import { C as version, S as name, _ as recordOutboxEnqueue, a as verifyRequestDetailed, d as validateCryptoKey, f as getDurationMs, h as isAbortError, i as verifyRequest, m as getRemoteHost, n as parseRfc9421SignatureInput, o as exportJwk, p as getFederationMetrics, t as doubleKnock, u as importJwk, v as formatAcceptSignature } from "./http-CpzZ9zsb.js";
6
- import { c as getKeyOwner, d as detachSignature, f as hasSignatureLike, i as verifyObject, m as verifyJsonLd, n as hasProofLike, o as normalizeOutgoingActivityJsonLd, p as signJsonLd, r as signObject, s as doesActorOwnKey } from "./proof-Vd8-1EWh.js";
5
+ import { E as version, T as name, _ as recordFanoutRecipients, a as verifyRequestDetailed, b as recordOutboxEnqueue, d as validateCryptoKey, f as getDurationMs, h as isAbortError, i as verifyRequest, m as getRemoteHost, n as parseRfc9421SignatureInput, o as exportJwk, p as getFederationMetrics, t as doubleKnock, u as importJwk, v as recordInboxActivity, x as formatAcceptSignature, y as recordOutboxActivity } from "./http-CouJSFVK.js";
6
+ import { c as getKeyOwner, d as detachSignature, f as hasSignatureLike, i as verifyObject, m as verifyJsonLd, n as hasProofLike, o as normalizeOutgoingActivityJsonLd, p as signJsonLd, r as signObject, s as doesActorOwnKey } from "./proof-n60t8o9P.js";
7
7
  import { n as getNodeInfo, t as nodeInfoToJson } from "./types-CAY3OdLq.js";
8
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-Wc5ezcVW.js";
8
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-DBNpsneh.js";
9
9
  import { getLogger, withContext } from "@logtape/logtape";
10
10
  import { Activity, Collection, CollectionPage, CryptographicKey, Link, Multikey, Object as Object$1, OrderedCollection, OrderedCollectionPage, Tombstone, getTypeId, lookupObject, traverseCollection } from "@fedify/vocab";
11
11
  import { SpanKind, SpanStatusCode, context, metrics, propagation, trace } from "@opentelemetry/api";
@@ -817,6 +817,7 @@ async function routeActivity({ context: ctx, json, activity, recipient, inboxLis
817
817
  code: SpanStatusCode.UNSET,
818
818
  message: `Activity ${activity.id?.href} has already been processed.`
819
819
  });
820
+ recordInboxActivity(meterProvider, "rejected", getTypeId(activity).href);
820
821
  return "alreadyProcessed";
821
822
  }
822
823
  }
@@ -826,6 +827,7 @@ async function routeActivity({ context: ctx, json, activity, recipient, inboxLis
826
827
  code: SpanStatusCode.ERROR,
827
828
  message: "Missing actor."
828
829
  });
830
+ recordInboxActivity(meterProvider, "rejected", getTypeId(activity).href);
829
831
  return "missingActor";
830
832
  }
831
833
  span.setAttribute("activitypub.actor.id", activity.actorId.href);
@@ -861,6 +863,7 @@ async function routeActivity({ context: ctx, json, activity, recipient, inboxLis
861
863
  queue,
862
864
  activityType: getTypeId(activity).href
863
865
  }, 0);
866
+ recordInboxActivity(meterProvider, "queued", getTypeId(activity).href);
864
867
  logger.info("Activity {activityId} is enqueued.", {
865
868
  activityId: activity.id?.href,
866
869
  activity: json,
@@ -880,6 +883,7 @@ async function routeActivity({ context: ctx, json, activity, recipient, inboxLis
880
883
  code: SpanStatusCode.UNSET,
881
884
  message: `Unsupported activity type: ${getTypeId(activity).href}`
882
885
  });
886
+ recordInboxActivity(meterProvider, "rejected", getTypeId(activity).href);
883
887
  span.end();
884
888
  return "unsupportedActivity";
885
889
  }
@@ -889,7 +893,7 @@ async function routeActivity({ context: ctx, json, activity, recipient, inboxLis
889
893
  const activityType = getTypeId(activity).href;
890
894
  const started = performance.now();
891
895
  try {
892
- await listener(inboxContextFactory(recipient, json, activity?.id?.href, activityType), activity);
896
+ await listener(inboxContextFactory(recipient, json, activity.id?.href, activityType), activity);
893
897
  } finally {
894
898
  getFederationMetrics(meterProvider).recordInboxProcessingDuration(activityType, getDurationMs(started));
895
899
  }
@@ -914,9 +918,11 @@ async function routeActivity({ context: ctx, json, activity, recipient, inboxLis
914
918
  code: SpanStatusCode.ERROR,
915
919
  message: String(error)
916
920
  });
921
+ recordInboxActivity(meterProvider, "rejected", getTypeId(activity).href);
917
922
  span.end();
918
923
  return "error";
919
924
  }
925
+ recordInboxActivity(meterProvider, "processed", getTypeId(activity).href);
920
926
  if (cacheKey != null) await kv.set(cacheKey, true, { ttl: Temporal.Duration.from({ days: 1 }) });
921
927
  logger.info("Activity {activityId} has been processed.", {
922
928
  activityId: activity.id?.href,
@@ -3233,6 +3239,7 @@ var FederationImpl = class extends FederationBuilderImpl {
3233
3239
  });
3234
3240
  }
3235
3241
  }
3242
+ recordOutboxActivity(this.meterProvider, "abandoned", message.activityType);
3236
3243
  return;
3237
3244
  }
3238
3245
  if (this.outboxQueue?.nativeRetrial) {
@@ -3263,11 +3270,15 @@ var FederationImpl = class extends FederationBuilderImpl {
3263
3270
  queue: outboxQueue,
3264
3271
  activityType: retryMessage.activityType
3265
3272
  }, retryMessage.attempt);
3273
+ recordOutboxActivity(this.meterProvider, "retried", retryMessage.activityType);
3266
3274
  }
3267
- } else logger.error("Failed to send activity {activityId} to {inbox} after {attempt} attempts; giving up:\n{error}", {
3268
- ...logData,
3269
- error
3270
- });
3275
+ } else {
3276
+ logger.error("Failed to send activity {activityId} to {inbox} after {attempt} attempts; giving up:\n{error}", {
3277
+ ...logData,
3278
+ error
3279
+ });
3280
+ recordOutboxActivity(this.meterProvider, "abandoned", message.activityType);
3281
+ }
3271
3282
  return;
3272
3283
  }
3273
3284
  logger.info("Successfully sent activity {activityId} to {inbox}.", { ...logData });
@@ -3302,6 +3313,7 @@ var FederationImpl = class extends FederationBuilderImpl {
3302
3313
  activity: message.activity,
3303
3314
  recipient: message.identifier
3304
3315
  });
3316
+ recordInboxActivity(this.meterProvider, "rejected", activityType);
3305
3317
  return;
3306
3318
  }
3307
3319
  }
@@ -3318,6 +3330,7 @@ var FederationImpl = class extends FederationBuilderImpl {
3318
3330
  code: SpanStatusCode.ERROR,
3319
3331
  message: `Unsupported activity type: ${activityType}`
3320
3332
  });
3333
+ recordInboxActivity(this.meterProvider, "rejected", activityType);
3321
3334
  span.end();
3322
3335
  return;
3323
3336
  }
@@ -3330,6 +3343,7 @@ var FederationImpl = class extends FederationBuilderImpl {
3330
3343
  } finally {
3331
3344
  getFederationMetrics(this.meterProvider).recordInboxProcessingDuration(activityType, getDurationMs(started));
3332
3345
  }
3346
+ recordInboxActivity(this.meterProvider, "processed", activityType);
3333
3347
  } catch (error) {
3334
3348
  try {
3335
3349
  await this.inboxErrorHandler?.(context, error);
@@ -3380,13 +3394,17 @@ var FederationImpl = class extends FederationBuilderImpl {
3380
3394
  queue: inboxQueue,
3381
3395
  activityType
3382
3396
  }, retryMessage.attempt);
3397
+ recordInboxActivity(this.meterProvider, "retried", activityType);
3383
3398
  }
3384
- } else logger.error("Failed to process the incoming activity {activityId} after {trial} attempts; giving up:\n{error}", {
3385
- error,
3386
- activityId: activity.id?.href,
3387
- activity: message.activity,
3388
- recipient: message.identifier
3389
- });
3399
+ } else {
3400
+ logger.error("Failed to process the incoming activity {activityId} after {trial} attempts; giving up:\n{error}", {
3401
+ error,
3402
+ activityId: activity.id?.href,
3403
+ activity: message.activity,
3404
+ recipient: message.identifier
3405
+ });
3406
+ recordInboxActivity(this.meterProvider, "abandoned", activityType);
3407
+ }
3390
3408
  span.setStatus({
3391
3409
  code: SpanStatusCode.ERROR,
3392
3410
  message: String(error)
@@ -4413,6 +4431,7 @@ var ContextImpl = class ContextImpl {
4413
4431
  queue: this.federation.fanoutQueue,
4414
4432
  activityType: message.activityType
4415
4433
  }, 0);
4434
+ recordFanoutRecipients(this.federation.meterProvider, globalThis.Object.keys(message.inboxes).length, message.activityType);
4416
4435
  return true;
4417
4436
  }
4418
4437
  async *getFollowers(identifier) {
@@ -2,25 +2,25 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as RouterError } from "./router-BT_F5748.mjs";
5
- import { n as version, t as name } from "./deno-CF3jMgip.mjs";
6
- import { i as isAbortError, n as getFederationMetrics, o as recordOutboxEnqueue, r as getRemoteHost, t as getDurationMs } from "./metrics-ek3ilf6c.mjs";
5
+ import { n as version, t as name } from "./deno-DVsHS7rA.mjs";
6
+ import { c as recordOutboxActivity, i as isAbortError, l as recordOutboxEnqueue, n as getFederationMetrics, o as recordFanoutRecipients, r as getRemoteHost, s as recordInboxActivity, t as getDurationMs } from "./metrics-C4attqv0.mjs";
7
7
  import { t as formatAcceptSignature } from "./accept-CgDcxvjV.mjs";
8
- import { a as importJwk, o as validateCryptoKey, t as exportJwk } from "./key-B4I8H5Lc.mjs";
9
- import { l as verifyRequest, o as parseRfc9421SignatureInput, u as verifyRequestDetailed } from "./http-BmOZYc-8.mjs";
10
- import { t as getAuthenticatedDocumentLoader } from "./docloader-BENj6vQ4.mjs";
8
+ import { a as importJwk, o as validateCryptoKey, t as exportJwk } from "./key-BoWaYRHm.mjs";
9
+ import { l as verifyRequest, o as parseRfc9421SignatureInput, u as verifyRequestDetailed } from "./http-DUV8ysti.mjs";
10
+ import { t as getAuthenticatedDocumentLoader } from "./docloader-WsWfKaE5.mjs";
11
11
  import { n as kvCache } from "./kv-cache-DihufyAQ.mjs";
12
- import { a as signJsonLd, i as hasSignatureLike, o as verifyJsonLd, r as detachSignature } from "./ld-B5D5THhl.mjs";
13
- import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-DO810N24.mjs";
12
+ import { a as signJsonLd, i as hasSignatureLike, o as verifyJsonLd, r as detachSignature } from "./ld-B5K1mSuG.mjs";
13
+ import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-hDxI0ufu.mjs";
14
14
  import { r as normalizeOutgoingActivityJsonLd } from "./outgoing-jsonld-BNL8AC14.mjs";
15
- import { i as verifyObject, n as hasProofLike, r as signObject } from "./proof-BgfyWv7b.mjs";
15
+ import { i as verifyObject, n as hasProofLike, r as signObject } from "./proof-DhVuz4bc.mjs";
16
16
  import { t as getNodeInfo } from "./client-Bneh_DYR.mjs";
17
17
  import { t as nodeInfoToJson } from "./types-D09GN0uZ.mjs";
18
- import { n as FederationBuilderImpl, t as ACTOR_ALIAS_PREFIX } from "./builder-YlEusQth.mjs";
18
+ import { n as FederationBuilderImpl, t as ACTOR_ALIAS_PREFIX } from "./builder-Ond_h57y.mjs";
19
19
  import { t as buildCollectionSynchronizationHeader } from "./collection-Cc3DVAhE.mjs";
20
20
  import { t as KvKeyCache } from "./keycache-BeU0LCII.mjs";
21
21
  import { t as acceptsJsonLd } from "./negotiation-DDstyBvc.mjs";
22
22
  import { t as createExponentialBackoffPolicy } from "./retry-_VvV0h9f.mjs";
23
- import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send-CAYXdUTk.mjs";
23
+ import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send-BPhyR5Oo.mjs";
24
24
  import { getLogger, withContext } from "@logtape/logtape";
25
25
  import { Activity, Collection, CollectionPage, CryptographicKey, Link, Multikey, Object as Object$1, OrderedCollection, OrderedCollectionPage, Tombstone, getTypeId, lookupObject, traverseCollection } from "@fedify/vocab";
26
26
  import { lookupWebFinger } from "@fedify/webfinger";
@@ -192,6 +192,7 @@ async function routeActivity({ context: ctx, json, activity, recipient, inboxLis
192
192
  code: SpanStatusCode.UNSET,
193
193
  message: `Activity ${activity.id?.href} has already been processed.`
194
194
  });
195
+ recordInboxActivity(meterProvider, "rejected", getTypeId(activity).href);
195
196
  return "alreadyProcessed";
196
197
  }
197
198
  }
@@ -201,6 +202,7 @@ async function routeActivity({ context: ctx, json, activity, recipient, inboxLis
201
202
  code: SpanStatusCode.ERROR,
202
203
  message: "Missing actor."
203
204
  });
205
+ recordInboxActivity(meterProvider, "rejected", getTypeId(activity).href);
204
206
  return "missingActor";
205
207
  }
206
208
  span.setAttribute("activitypub.actor.id", activity.actorId.href);
@@ -236,6 +238,7 @@ async function routeActivity({ context: ctx, json, activity, recipient, inboxLis
236
238
  queue,
237
239
  activityType: getTypeId(activity).href
238
240
  }, 0);
241
+ recordInboxActivity(meterProvider, "queued", getTypeId(activity).href);
239
242
  logger.info("Activity {activityId} is enqueued.", {
240
243
  activityId: activity.id?.href,
241
244
  activity: json,
@@ -255,6 +258,7 @@ async function routeActivity({ context: ctx, json, activity, recipient, inboxLis
255
258
  code: SpanStatusCode.UNSET,
256
259
  message: `Unsupported activity type: ${getTypeId(activity).href}`
257
260
  });
261
+ recordInboxActivity(meterProvider, "rejected", getTypeId(activity).href);
258
262
  span.end();
259
263
  return "unsupportedActivity";
260
264
  }
@@ -264,7 +268,7 @@ async function routeActivity({ context: ctx, json, activity, recipient, inboxLis
264
268
  const activityType = getTypeId(activity).href;
265
269
  const started = performance.now();
266
270
  try {
267
- await listener(inboxContextFactory(recipient, json, activity?.id?.href, activityType), activity);
271
+ await listener(inboxContextFactory(recipient, json, activity.id?.href, activityType), activity);
268
272
  } finally {
269
273
  getFederationMetrics(meterProvider).recordInboxProcessingDuration(activityType, getDurationMs(started));
270
274
  }
@@ -289,9 +293,11 @@ async function routeActivity({ context: ctx, json, activity, recipient, inboxLis
289
293
  code: SpanStatusCode.ERROR,
290
294
  message: String(error)
291
295
  });
296
+ recordInboxActivity(meterProvider, "rejected", getTypeId(activity).href);
292
297
  span.end();
293
298
  return "error";
294
299
  }
300
+ recordInboxActivity(meterProvider, "processed", getTypeId(activity).href);
295
301
  if (cacheKey != null) await kv.set(cacheKey, true, { ttl: Temporal.Duration.from({ days: 1 }) });
296
302
  logger.info("Activity {activityId} has been processed.", {
297
303
  activityId: activity.id?.href,
@@ -2135,6 +2141,7 @@ var FederationImpl = class extends FederationBuilderImpl {
2135
2141
  });
2136
2142
  }
2137
2143
  }
2144
+ recordOutboxActivity(this.meterProvider, "abandoned", message.activityType);
2138
2145
  return;
2139
2146
  }
2140
2147
  if (this.outboxQueue?.nativeRetrial) {
@@ -2165,11 +2172,15 @@ var FederationImpl = class extends FederationBuilderImpl {
2165
2172
  queue: outboxQueue,
2166
2173
  activityType: retryMessage.activityType
2167
2174
  }, retryMessage.attempt);
2175
+ recordOutboxActivity(this.meterProvider, "retried", retryMessage.activityType);
2168
2176
  }
2169
- } else logger.error("Failed to send activity {activityId} to {inbox} after {attempt} attempts; giving up:\n{error}", {
2170
- ...logData,
2171
- error
2172
- });
2177
+ } else {
2178
+ logger.error("Failed to send activity {activityId} to {inbox} after {attempt} attempts; giving up:\n{error}", {
2179
+ ...logData,
2180
+ error
2181
+ });
2182
+ recordOutboxActivity(this.meterProvider, "abandoned", message.activityType);
2183
+ }
2173
2184
  return;
2174
2185
  }
2175
2186
  logger.info("Successfully sent activity {activityId} to {inbox}.", { ...logData });
@@ -2204,6 +2215,7 @@ var FederationImpl = class extends FederationBuilderImpl {
2204
2215
  activity: message.activity,
2205
2216
  recipient: message.identifier
2206
2217
  });
2218
+ recordInboxActivity(this.meterProvider, "rejected", activityType);
2207
2219
  return;
2208
2220
  }
2209
2221
  }
@@ -2220,6 +2232,7 @@ var FederationImpl = class extends FederationBuilderImpl {
2220
2232
  code: SpanStatusCode.ERROR,
2221
2233
  message: `Unsupported activity type: ${activityType}`
2222
2234
  });
2235
+ recordInboxActivity(this.meterProvider, "rejected", activityType);
2223
2236
  span.end();
2224
2237
  return;
2225
2238
  }
@@ -2232,6 +2245,7 @@ var FederationImpl = class extends FederationBuilderImpl {
2232
2245
  } finally {
2233
2246
  getFederationMetrics(this.meterProvider).recordInboxProcessingDuration(activityType, getDurationMs(started));
2234
2247
  }
2248
+ recordInboxActivity(this.meterProvider, "processed", activityType);
2235
2249
  } catch (error) {
2236
2250
  try {
2237
2251
  await this.inboxErrorHandler?.(context, error);
@@ -2282,13 +2296,17 @@ var FederationImpl = class extends FederationBuilderImpl {
2282
2296
  queue: inboxQueue,
2283
2297
  activityType
2284
2298
  }, retryMessage.attempt);
2299
+ recordInboxActivity(this.meterProvider, "retried", activityType);
2285
2300
  }
2286
- } else logger.error("Failed to process the incoming activity {activityId} after {trial} attempts; giving up:\n{error}", {
2287
- error,
2288
- activityId: activity.id?.href,
2289
- activity: message.activity,
2290
- recipient: message.identifier
2291
- });
2301
+ } else {
2302
+ logger.error("Failed to process the incoming activity {activityId} after {trial} attempts; giving up:\n{error}", {
2303
+ error,
2304
+ activityId: activity.id?.href,
2305
+ activity: message.activity,
2306
+ recipient: message.identifier
2307
+ });
2308
+ recordInboxActivity(this.meterProvider, "abandoned", activityType);
2309
+ }
2292
2310
  span.setStatus({
2293
2311
  code: SpanStatusCode.ERROR,
2294
2312
  message: String(error)
@@ -3315,6 +3333,7 @@ var ContextImpl = class ContextImpl {
3315
3333
  queue: this.federation.fanoutQueue,
3316
3334
  activityType: message.activityType
3317
3335
  }, 0);
3336
+ recordFanoutRecipients(this.federation.meterProvider, globalThis.Object.keys(message.inboxes).length, message.activityType);
3318
3337
  return true;
3319
3338
  }
3320
3339
  async *getFollowers(identifier) {
package/dist/mod.cjs CHANGED
@@ -4,11 +4,11 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
4
  require("./chunk-DDcVe30Y.cjs");
5
5
  const require_transformers = require("./transformers-NeAONrAq.cjs");
6
6
  require("./compat/mod.cjs");
7
- const require_http = require("./http-CKCgOPkX.cjs");
8
- const require_middleware = require("./middleware-EqTYPG4F.cjs");
9
- const require_proof = require("./proof-DIoqrKnX.cjs");
7
+ const require_http = require("./http-CubOB9wq.cjs");
8
+ const require_middleware = require("./middleware-CmsDtIHI.cjs");
9
+ const require_proof = require("./proof-BUWfVr6Q.cjs");
10
10
  const require_types = require("./types-KC4QAoxe.cjs");
11
- const require_kv_cache = require("./kv-cache-DY-XWOqM.cjs");
11
+ const require_kv_cache = require("./kv-cache-Dz31ATUT.cjs");
12
12
  const require_federation_mod = require("./federation/mod.cjs");
13
13
  require("./nodeinfo/mod.cjs");
14
14
  require("./runtime/mod.cjs");
package/dist/mod.js CHANGED
@@ -3,11 +3,11 @@ import { URLPattern } from "urlpattern-polyfill";
3
3
  import "./chunk-CRNNMoPX.js";
4
4
  import { n as autoIdAssigner, r as getDefaultActivityTransformers, t as actorDehydrator } from "./transformers-BGMIq1cs.js";
5
5
  import "./compat/mod.js";
6
- import { a as verifyRequestDetailed, b as parseAcceptSignature, c as fetchKeyDetailed, i as verifyRequest, l as generateCryptoKeyPair, o as exportJwk, r as signRequest, s as fetchKey, u as importJwk, v as formatAcceptSignature, x as validateAcceptSignature, y as fulfillAcceptSignature } from "./http-CpzZ9zsb.js";
7
- import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as Router, f as RouterError, i as SendActivityError, l as digest, o as respondWithObject, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as createFederationBuilder } from "./middleware-CuZbBw-N.js";
8
- import { a as verifyProof, c as getKeyOwner, d as detachSignature, f as hasSignatureLike, h as verifySignature, i as verifyObject, l as attachSignature, m as verifyJsonLd, n as hasProofLike, p as signJsonLd, r as signObject, s as doesActorOwnKey, t as createProof, u as createSignature } from "./proof-Vd8-1EWh.js";
6
+ import { C as parseAcceptSignature, S as fulfillAcceptSignature, a as verifyRequestDetailed, c as fetchKeyDetailed, i as verifyRequest, l as generateCryptoKeyPair, o as exportJwk, r as signRequest, s as fetchKey, u as importJwk, w as validateAcceptSignature, x as formatAcceptSignature } from "./http-CouJSFVK.js";
7
+ import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as Router, f as RouterError, i as SendActivityError, l as digest, o as respondWithObject, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as createFederationBuilder } from "./middleware-Dtjz-hSk.js";
8
+ import { a as verifyProof, c as getKeyOwner, d as detachSignature, f as hasSignatureLike, h as verifySignature, i as verifyObject, l as attachSignature, m as verifyJsonLd, n as hasProofLike, p as signJsonLd, r as signObject, s as doesActorOwnKey, t as createProof, u as createSignature } from "./proof-n60t8o9P.js";
9
9
  import { n as getNodeInfo, r as parseNodeInfo, t as nodeInfoToJson } from "./types-CAY3OdLq.js";
10
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-Wc5ezcVW.js";
10
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-DBNpsneh.js";
11
11
  import { InProcessMessageQueue, MemoryKvStore, ParallelMessageQueue } 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-BAE7AKLA.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
6
  import "../std__assert-BTEgfoJo.mjs";
7
7
  import { t as MemoryKvStore } from "../kv-QHE0oeM3.mjs";
8
- import { _ as handleNodeInfoJrd, g as handleNodeInfo, o as createFederation } from "../middleware-DlcecZMq.mjs";
8
+ import { _ as handleNodeInfoJrd, g as handleNodeInfo, o as createFederation } from "../middleware-t0jC8I99.mjs";
9
9
  import { test } from "@fedify/fixture";
10
10
  //#region src/nodeinfo/handler.test.ts
11
11
  test("handleNodeInfo()", async () => {
@@ -1,8 +1,8 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-CF3jMgip.mjs";
5
- import "./key-B4I8H5Lc.mjs";
4
+ import { n as version, t as name } from "./deno-DVsHS7rA.mjs";
5
+ import "./key-BoWaYRHm.mjs";
6
6
  import { CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
7
7
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
8
8
  import { getDocumentLoader } from "@fedify/vocab-runtime";
@@ -1,7 +1,7 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  const require_chunk = require("./chunk-DDcVe30Y.cjs");
4
- const require_http = require("./http-CKCgOPkX.cjs");
4
+ const require_http = require("./http-CubOB9wq.cjs");
5
5
  let _logtape_logtape = require("@logtape/logtape");
6
6
  let _fedify_vocab = require("@fedify/vocab");
7
7
  let _opentelemetry_api = require("@opentelemetry/api");
@@ -1,9 +1,9 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-CF3jMgip.mjs";
5
- import { a as measureSignatureKeyFetch, n as getFederationMetrics, t as getDurationMs } from "./metrics-ek3ilf6c.mjs";
6
- import { n as fetchKey, o as validateCryptoKey } from "./key-B4I8H5Lc.mjs";
4
+ import { n as version, t as name } from "./deno-DVsHS7rA.mjs";
5
+ import { a as measureSignatureKeyFetch, n as getFederationMetrics, t as getDurationMs } from "./metrics-C4attqv0.mjs";
6
+ import { n as fetchKey, o as validateCryptoKey } from "./key-BoWaYRHm.mjs";
7
7
  import { n as preloadedOnlyDocumentLoader } from "./public-audience-c9zmYKgA.mjs";
8
8
  import { r as normalizeOutgoingActivityJsonLd } from "./outgoing-jsonld-BNL8AC14.mjs";
9
9
  import { getLogger } from "@logtape/logtape";
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { C as version, S as name, d as validateCryptoKey, f as getDurationMs, g as measureSignatureKeyFetch, p as getFederationMetrics, s as fetchKey } from "./http-CpzZ9zsb.js";
3
+ import { E as version, T as name, d as validateCryptoKey, f as getDurationMs, g as measureSignatureKeyFetch, p as getFederationMetrics, s as fetchKey } from "./http-CouJSFVK.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
  import { Activity, CryptographicKey, DataIntegrityProof, Multikey, Object as Object$1, PUBLIC_COLLECTION, getTypeId, isActor } from "@fedify/vocab";
6
6
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
@@ -1,9 +1,9 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-CF3jMgip.mjs";
5
- import { n as getFederationMetrics, t as getDurationMs } from "./metrics-ek3ilf6c.mjs";
6
- import { n as doubleKnock } from "./http-BmOZYc-8.mjs";
4
+ import { n as version, t as name } from "./deno-DVsHS7rA.mjs";
5
+ import { n as getFederationMetrics, t as getDurationMs } from "./metrics-C4attqv0.mjs";
6
+ import { n as doubleKnock } from "./http-DUV8ysti.mjs";
7
7
  import { getLogger } from "@logtape/logtape";
8
8
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
9
9
  //#region src/federation/send.ts
@@ -7,8 +7,8 @@ import { n as assertGreaterOrEqual, r as assertFalse, t as assertRejects } from
7
7
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
8
8
  import { t as assert } from "../assert-DikXweDx.mjs";
9
9
  import { t as esm_default } from "../esm-sdtqOUPu.mjs";
10
- import { t as exportJwk } from "../key-B4I8H5Lc.mjs";
11
- import { a as parseRfc9421Signature, c as timingSafeEqual, i as formatRfc9421SignatureParameters, l as verifyRequest, n as doubleKnock, o as parseRfc9421SignatureInput, r as formatRfc9421Signature, s as signRequest, t as createRfc9421SignatureBase, u as verifyRequestDetailed } from "../http-BmOZYc-8.mjs";
10
+ import { t as exportJwk } from "../key-BoWaYRHm.mjs";
11
+ import { a as parseRfc9421Signature, c as timingSafeEqual, i as formatRfc9421SignatureParameters, l as verifyRequest, n as doubleKnock, o as parseRfc9421SignatureInput, r as formatRfc9421Signature, s as signRequest, t as createRfc9421SignatureBase, u as verifyRequestDetailed } from "../http-DUV8ysti.mjs";
12
12
  import { i as rsaPrivateKey2, l as rsaPublicKey5, o as rsaPublicKey1, s as rsaPublicKey2 } from "../keys-CSYsOMFG.mjs";
13
13
  import { createTestMeterProvider, createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
14
14
  import { FetchError, exportSpki } from "@fedify/vocab-runtime";
@@ -5,7 +5,7 @@ import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import "../std__assert-BTEgfoJo.mjs";
6
6
  import { t as assertRejects } from "../assert_rejects-DQP-q39h.mjs";
7
7
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
8
- import { a as importJwk, i as generateCryptoKeyPair, n as fetchKey, o as validateCryptoKey, r as fetchKeyDetailed, t as exportJwk } from "../key-B4I8H5Lc.mjs";
8
+ import { a as importJwk, i as generateCryptoKeyPair, n as fetchKey, o as validateCryptoKey, r as fetchKeyDetailed, t as exportJwk } from "../key-BoWaYRHm.mjs";
9
9
  import { c as rsaPublicKey3, i as rsaPrivateKey2, o as rsaPublicKey1, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CSYsOMFG.mjs";
10
10
  import { CryptographicKey, Multikey } from "@fedify/vocab";
11
11
  import { createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
@@ -5,9 +5,9 @@ import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import { n as assertGreaterOrEqual, r as assertFalse, t as assertRejects } from "../assert_rejects-DQP-q39h.mjs";
6
6
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
7
7
  import { t as assert } from "../assert-DikXweDx.mjs";
8
- import { i as generateCryptoKeyPair } from "../key-B4I8H5Lc.mjs";
8
+ import { i as generateCryptoKeyPair } from "../key-BoWaYRHm.mjs";
9
9
  import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CSYsOMFG.mjs";
10
- import { a as signJsonLd, i as hasSignatureLike, n as createSignature, o as verifyJsonLd, r as detachSignature, s as verifySignature, t as attachSignature } from "../ld-B5D5THhl.mjs";
10
+ import { a as signJsonLd, i as hasSignatureLike, n as createSignature, o as verifyJsonLd, r as detachSignature, s as verifySignature, t as attachSignature } from "../ld-B5K1mSuG.mjs";
11
11
  import { CryptographicKey } from "@fedify/vocab";
12
12
  import { createTestMeterProvider, mockDocumentLoader, test } from "@fedify/fixture";
13
13
  import { encodeBase64 } from "byte-encodings/base64";
package/dist/sig/mod.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
- const require_http = require("../http-CKCgOPkX.cjs");
5
- const require_proof = require("../proof-DIoqrKnX.cjs");
4
+ const require_http = require("../http-CubOB9wq.cjs");
5
+ const require_proof = require("../proof-BUWfVr6Q.cjs");
6
6
  exports.attachSignature = require_proof.attachSignature;
7
7
  exports.createProof = require_proof.createProof;
8
8
  exports.createSignature = require_proof.createSignature;
package/dist/sig/mod.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { a as verifyRequestDetailed, b as parseAcceptSignature, c as fetchKeyDetailed, i as verifyRequest, l as generateCryptoKeyPair, o as exportJwk, r as signRequest, s as fetchKey, u as importJwk, v as formatAcceptSignature, x as validateAcceptSignature, y as fulfillAcceptSignature } from "../http-CpzZ9zsb.js";
4
- import { a as verifyProof, c as getKeyOwner, d as detachSignature, f as hasSignatureLike, h as verifySignature, i as verifyObject, l as attachSignature, m as verifyJsonLd, n as hasProofLike, p as signJsonLd, r as signObject, s as doesActorOwnKey, t as createProof, u as createSignature } from "../proof-Vd8-1EWh.js";
3
+ import { C as parseAcceptSignature, S as fulfillAcceptSignature, a as verifyRequestDetailed, c as fetchKeyDetailed, i as verifyRequest, l as generateCryptoKeyPair, o as exportJwk, r as signRequest, s as fetchKey, u as importJwk, w as validateAcceptSignature, x as formatAcceptSignature } from "../http-CouJSFVK.js";
4
+ import { a as verifyProof, c as getKeyOwner, d as detachSignature, f as hasSignatureLike, h as verifySignature, i as verifyObject, l as attachSignature, m as verifyJsonLd, n as hasProofLike, p as signJsonLd, r as signObject, s as doesActorOwnKey, t as createProof, u as createSignature } from "../proof-n60t8o9P.js";
5
5
  export { attachSignature, createProof, createSignature, detachSignature, doesActorOwnKey, exportJwk, fetchKey, fetchKeyDetailed, formatAcceptSignature, fulfillAcceptSignature, generateCryptoKeyPair, getKeyOwner, hasProofLike, hasSignatureLike, importJwk, parseAcceptSignature, signJsonLd, signObject, signRequest, validateAcceptSignature, verifyJsonLd, verifyObject, verifyProof, verifyRequest, verifyRequestDetailed, verifySignature };
@@ -6,7 +6,7 @@ import "../std__assert-BTEgfoJo.mjs";
6
6
  import { r as assertFalse } from "../assert_rejects-DQP-q39h.mjs";
7
7
  import { t as assert } from "../assert-DikXweDx.mjs";
8
8
  import { o as rsaPublicKey1, s as rsaPublicKey2 } from "../keys-CSYsOMFG.mjs";
9
- import { n as getKeyOwner, t as doesActorOwnKey } from "../owner-DO810N24.mjs";
9
+ import { n as getKeyOwner, t as doesActorOwnKey } from "../owner-hDxI0ufu.mjs";
10
10
  import { Create, CryptographicKey, lookupObject } from "@fedify/vocab";
11
11
  import { createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
12
12
  //#region src/sig/owner.test.ts
@@ -8,7 +8,7 @@ import { t as assertInstanceOf } from "../assert_instance_of-C4Ri6VuN.mjs";
8
8
  import { t as assert } from "../assert-DikXweDx.mjs";
9
9
  import { i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CSYsOMFG.mjs";
10
10
  import { r as normalizeOutgoingActivityJsonLd } from "../outgoing-jsonld-BNL8AC14.mjs";
11
- import { a as verifyProof, i as verifyObject, n as hasProofLike, r as signObject, t as createProof } from "../proof-BgfyWv7b.mjs";
11
+ import { a as verifyProof, i as verifyObject, n as hasProofLike, r as signObject, t as createProof } from "../proof-DhVuz4bc.mjs";
12
12
  import { Create, DataIntegrityProof, Document, Multikey, Note, PUBLIC_COLLECTION, Place } from "@fedify/vocab";
13
13
  import { createTestMeterProvider, mockDocumentLoader, test } from "@fedify/fixture";
14
14
  import { decodeMultibase, importMultibaseKey } from "@fedify/vocab-runtime";
@@ -5,9 +5,9 @@ import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import "../std__assert-BTEgfoJo.mjs";
6
6
  import { t as assertRejects } from "../assert_rejects-DQP-q39h.mjs";
7
7
  import { t as esm_default } from "../esm-sdtqOUPu.mjs";
8
- import { l as verifyRequest } from "../http-BmOZYc-8.mjs";
8
+ import { l as verifyRequest } from "../http-DUV8ysti.mjs";
9
9
  import { i as rsaPrivateKey2 } from "../keys-CSYsOMFG.mjs";
10
- import { t as getAuthenticatedDocumentLoader } from "../docloader-BENj6vQ4.mjs";
10
+ import { t as getAuthenticatedDocumentLoader } from "../docloader-WsWfKaE5.mjs";
11
11
  import { mockDocumentLoader, test } from "@fedify/fixture";
12
12
  import { UrlError } from "@fedify/vocab-runtime";
13
13
  //#region src/utils/docloader.test.ts
@@ -1,6 +1,6 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
- const require_kv_cache = require("../kv-cache-DY-XWOqM.cjs");
4
+ const require_kv_cache = require("../kv-cache-Dz31ATUT.cjs");
5
5
  exports.getAuthenticatedDocumentLoader = require_kv_cache.getAuthenticatedDocumentLoader;
6
6
  exports.kvCache = require_kv_cache.kvCache;
package/dist/utils/mod.js CHANGED
@@ -1,4 +1,4 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "../kv-cache-Wc5ezcVW.js";
3
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "../kv-cache-DBNpsneh.js";
4
4
  export { getAuthenticatedDocumentLoader, kvCache };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/fedify",
3
- "version": "2.3.0-dev.1114+15a3316d",
3
+ "version": "2.3.0-dev.1119+6cc02662",
4
4
  "description": "An ActivityPub server framework",
5
5
  "keywords": [
6
6
  "ActivityPub",
@@ -153,9 +153,9 @@
153
153
  "uri-template-router": "^1.0.0",
154
154
  "url-template": "^3.1.1",
155
155
  "urlpattern-polyfill": "^10.1.0",
156
- "@fedify/vocab": "2.3.0-dev.1114+15a3316d",
157
- "@fedify/vocab-runtime": "2.3.0-dev.1114+15a3316d",
158
- "@fedify/webfinger": "2.3.0-dev.1114+15a3316d"
156
+ "@fedify/vocab": "2.3.0-dev.1119+6cc02662",
157
+ "@fedify/vocab-runtime": "2.3.0-dev.1119+6cc02662",
158
+ "@fedify/webfinger": "2.3.0-dev.1119+6cc02662"
159
159
  },
160
160
  "devDependencies": {
161
161
  "@opentelemetry/sdk-metrics": "2.7.1",
@@ -169,7 +169,7 @@
169
169
  "typescript": "^6.0.0",
170
170
  "wrangler": "^4.17.0",
171
171
  "@fedify/fixture": "2.0.0",
172
- "@fedify/vocab-tools": "^2.3.0-dev.1114+15a3316d"
172
+ "@fedify/vocab-tools": "^2.3.0-dev.1119+6cc02662"
173
173
  },
174
174
  "scripts": {
175
175
  "build:self": "tsdown",