@fedify/fedify 2.3.0-dev.1158 → 2.3.0-dev.1172

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 (48) hide show
  1. package/dist/{builder-B66L9i5E.mjs → builder-JoFBmqfM.mjs} +2 -2
  2. package/dist/compat/transformers.test.mjs +1 -1
  3. package/dist/{deno-O_rwum1q.mjs → deno-Cb_y5qEi.mjs} +1 -1
  4. package/dist/{docloader-Ct8PhKFS.mjs → docloader-Bv4TW6eo.mjs} +2 -2
  5. package/dist/federation/builder.test.mjs +1 -1
  6. package/dist/federation/handler.test.mjs +305 -3
  7. package/dist/federation/idempotency.test.mjs +2 -2
  8. package/dist/federation/metrics.test.mjs +80 -1
  9. package/dist/federation/middleware.test.mjs +20 -6
  10. package/dist/federation/mod.cjs +1 -1
  11. package/dist/federation/mod.js +1 -1
  12. package/dist/federation/send.test.mjs +3 -3
  13. package/dist/federation/temporal.test.mjs +1 -1
  14. package/dist/federation/webfinger.test.mjs +1 -1
  15. package/dist/{http-BoRhhcgB.mjs → http--aE0vk2u.mjs} +3 -3
  16. package/dist/{http-CFP8WMMv.js → http-C0XZv7iH.js} +92 -2
  17. package/dist/{http-DlPd_LYM.cjs → http-D_HNhC57.cjs} +115 -1
  18. package/dist/{key-DyATZSWG.mjs → key-Cl_bixZo.mjs} +2 -2
  19. package/dist/{kv-cache-BJo6COYN.cjs → kv-cache-CdOuPFgC.cjs} +1 -1
  20. package/dist/{kv-cache-DeJE8EeD.mjs → kv-cache-DQUblF4f.mjs} +1 -1
  21. package/dist/{kv-cache-dH0biV98.js → kv-cache-DsbVBK7Y.js} +1 -1
  22. package/dist/{ld-B8wjsKDJ.mjs → ld-xVq6y31b.mjs} +3 -3
  23. package/dist/{metrics-oMUWaw6W.mjs → metrics-CKticT28.mjs} +92 -2
  24. package/dist/{middleware-DwZ1ofL9.js → middleware-BSuEI4Qf.js} +318 -107
  25. package/dist/{middleware-BzOa0ncb.mjs → middleware-BmPIKmb4.mjs} +1 -1
  26. package/dist/{middleware-xtTRaiJL.mjs → middleware-DHM2Pjqf.mjs} +327 -116
  27. package/dist/{middleware-CcJyVEpv.cjs → middleware-hxnyAewn.cjs} +318 -107
  28. package/dist/mod.cjs +4 -4
  29. package/dist/mod.js +4 -4
  30. package/dist/nodeinfo/handler.test.mjs +1 -1
  31. package/dist/{owner-BxjgK8PG.mjs → owner-DmU2qEh_.mjs} +2 -2
  32. package/dist/{proof-42Q9NiqN.mjs → proof-1XBgQ0Z0.mjs} +3 -3
  33. package/dist/{proof-B_6gAVQ2.js → proof-CmS6yxgt.js} +1 -1
  34. package/dist/{proof-CfttNzWW.cjs → proof-wm6UxUoM.cjs} +1 -1
  35. package/dist/{send-R1_K46CH.mjs → send-CmtB8w5D.mjs} +3 -3
  36. package/dist/sig/http.test.mjs +2 -2
  37. package/dist/sig/key.test.mjs +1 -1
  38. package/dist/sig/ld.test.mjs +2 -2
  39. package/dist/sig/mod.cjs +2 -2
  40. package/dist/sig/mod.js +2 -2
  41. package/dist/sig/owner.test.mjs +1 -1
  42. package/dist/sig/proof.test.mjs +1 -1
  43. package/dist/{temporal-8kDX3E4q.mjs → temporal-DE9_a2nI.mjs} +1 -1
  44. package/dist/utils/docloader.test.mjs +2 -2
  45. package/dist/utils/kv-cache.test.mjs +1 -1
  46. package/dist/utils/mod.cjs +1 -1
  47. package/dist/utils/mod.js +1 -1
  48. package/package.json +6 -6
@@ -10,7 +10,7 @@ import { ATTR_HTTP_REQUEST_HEADER, ATTR_HTTP_REQUEST_METHOD, ATTR_URL_FULL } fro
10
10
  import { decodeBase64, encodeBase64 } from "byte-encodings/base64";
11
11
  //#region deno.json
12
12
  var name = "@fedify/fedify";
13
- var version = "2.3.0-dev.1158+e7295772";
13
+ var version = "2.3.0-dev.1172+8cc8a23f";
14
14
  //#endregion
15
15
  //#region src/sig/accept.ts
16
16
  /**
@@ -178,6 +178,10 @@ var FederationMetrics = class {
178
178
  documentCache;
179
179
  webFingerHandle;
180
180
  webFingerHandleDuration;
181
+ collectionRequest;
182
+ collectionDispatchDuration;
183
+ collectionPageItems;
184
+ collectionTotalItems;
181
185
  constructor(meterProvider) {
182
186
  const meter = meterProvider.getMeter(name, version);
183
187
  this.deliverySent = meter.createCounter("activitypub.delivery.sent", {
@@ -360,6 +364,38 @@ var FederationMetrics = class {
360
364
  1e4
361
365
  ] }
362
366
  });
367
+ this.collectionRequest = meter.createCounter("activitypub.collection.request", {
368
+ description: "ActivityPub collection and collection-page requests handled by Fedify.",
369
+ unit: "{request}"
370
+ });
371
+ this.collectionDispatchDuration = meter.createHistogram("activitypub.collection.dispatch.duration", {
372
+ description: "Duration of ActivityPub collection dispatcher callbacks.",
373
+ unit: "ms",
374
+ advice: { explicitBucketBoundaries: [
375
+ 5,
376
+ 10,
377
+ 25,
378
+ 50,
379
+ 75,
380
+ 100,
381
+ 250,
382
+ 500,
383
+ 750,
384
+ 1e3,
385
+ 2500,
386
+ 5e3,
387
+ 7500,
388
+ 1e4
389
+ ] }
390
+ });
391
+ this.collectionPageItems = meter.createHistogram("activitypub.collection.page.items", {
392
+ description: "Number of items Fedify materialized for an ActivityPub collection response.",
393
+ unit: "{item}"
394
+ });
395
+ this.collectionTotalItems = meter.createHistogram("activitypub.collection.total_items", {
396
+ description: "Total item count reported by ActivityPub collection counters.",
397
+ unit: "{item}"
398
+ });
363
399
  }
364
400
  recordDelivery(inbox, durationMs, success, activityType) {
365
401
  const deliveryAttributes = {
@@ -480,7 +516,29 @@ var FederationMetrics = class {
480
516
  this.webFingerHandle.add(1, attributes);
481
517
  this.webFingerHandleDuration.record(attrs.durationMs, attributes);
482
518
  }
519
+ recordCollectionRequest(attrs) {
520
+ this.collectionRequest.add(1, buildCollectionAttributes(attrs));
521
+ }
522
+ recordCollectionDispatchDuration(durationMs, attrs) {
523
+ this.collectionDispatchDuration.record(durationMs, buildCollectionAttributes(attrs));
524
+ }
525
+ recordCollectionPageItems(itemCount, attrs) {
526
+ this.collectionPageItems.record(itemCount, buildCollectionAttributes(attrs));
527
+ }
528
+ recordCollectionTotalItems(totalItems, attrs) {
529
+ this.collectionTotalItems.record(totalItems, buildCollectionAttributes(attrs));
530
+ }
483
531
  };
532
+ function buildCollectionAttributes(attrs) {
533
+ const attributes = {
534
+ "activitypub.collection.kind": attrs.kind,
535
+ "activitypub.collection.page": attrs.page,
536
+ "activitypub.collection.result": attrs.result,
537
+ "fedify.collection.dispatcher": attrs.dispatcher
538
+ };
539
+ if (attrs.statusCode != null) attributes["http.response.status_code"] = attrs.statusCode;
540
+ return attributes;
541
+ }
484
542
  function buildActivityLifecycleAttributes(result, activityType) {
485
543
  const attributes = { "activitypub.processing.result": result };
486
544
  if (activityType != null) attributes["activitypub.activity.type"] = activityType;
@@ -617,6 +675,38 @@ function recordWebFingerHandle(meterProvider, attrs) {
617
675
  getFederationMetrics(meterProvider).recordWebFingerHandle(attrs);
618
676
  }
619
677
  /**
678
+ * Records one `activitypub.collection.request` measurement for a
679
+ * collection or collection-page request handled by Fedify.
680
+ * @since 2.3.0
681
+ */
682
+ function recordCollectionRequest(meterProvider, attrs) {
683
+ getFederationMetrics(meterProvider).recordCollectionRequest(attrs);
684
+ }
685
+ /**
686
+ * Records one `activitypub.collection.dispatch.duration` measurement for a
687
+ * collection dispatcher callback invocation.
688
+ * @since 2.3.0
689
+ */
690
+ function recordCollectionDispatchDuration(meterProvider, durationMs, attrs) {
691
+ getFederationMetrics(meterProvider).recordCollectionDispatchDuration(durationMs, attrs);
692
+ }
693
+ /**
694
+ * Records one `activitypub.collection.page.items` measurement when Fedify
695
+ * has materialized collection items in memory.
696
+ * @since 2.3.0
697
+ */
698
+ function recordCollectionPageItems(meterProvider, itemCount, attrs) {
699
+ getFederationMetrics(meterProvider).recordCollectionPageItems(itemCount, attrs);
700
+ }
701
+ /**
702
+ * Records one `activitypub.collection.total_items` measurement when a
703
+ * collection counter has already reported a total item count.
704
+ * @since 2.3.0
705
+ */
706
+ function recordCollectionTotalItems(meterProvider, totalItems, attrs) {
707
+ getFederationMetrics(meterProvider).recordCollectionTotalItems(totalItems, attrs);
708
+ }
709
+ /**
620
710
  * Classifies a thrown value from a key or document fetch into the bounded
621
711
  * {@link LookupResult} taxonomy and, when an HTTP response was received,
622
712
  * surfaces its status code.
@@ -2222,4 +2312,4 @@ function timingSafeEqual(a, b) {
2222
2312
  return result === 0;
2223
2313
  }
2224
2314
  //#endregion
2225
- export { recordWebFingerHandle as C, validateAcceptSignature as D, parseAcceptSignature as E, name as O, recordOutboxEnqueue as S, fulfillAcceptSignature as T, measureSignatureKeyFetch as _, verifyRequestDetailed as a, recordInboxActivity as b, fetchKeyDetailed as c, validateCryptoKey as d, getDurationMs as f, isAbortError$1 as g, instrumentDocumentLoader as h, verifyRequest as i, version as k, generateCryptoKeyPair as l, getRemoteHost as m, parseRfc9421SignatureInput as n, exportJwk as o, getFederationMetrics as p, signRequest as r, fetchKey as s, doubleKnock as t, importJwk as u, recordDocumentCache as v, formatAcceptSignature as w, recordOutboxActivity as x, recordFanoutRecipients as y };
2315
+ export { parseAcceptSignature as A, recordFanoutRecipients as C, recordWebFingerHandle as D, recordOutboxEnqueue as E, name as M, version as N, formatAcceptSignature as O, recordDocumentCache as S, recordOutboxActivity as T, measureSignatureKeyFetch as _, verifyRequestDetailed as a, recordCollectionRequest as b, fetchKeyDetailed as c, validateCryptoKey as d, getDurationMs as f, isAbortError$1 as g, instrumentDocumentLoader as h, verifyRequest as i, validateAcceptSignature as j, fulfillAcceptSignature as k, generateCryptoKeyPair as l, getRemoteHost as m, parseRfc9421SignatureInput as n, exportJwk as o, getFederationMetrics as p, signRequest as r, fetchKey as s, doubleKnock as t, importJwk as u, recordCollectionDispatchDuration as v, recordInboxActivity as w, recordCollectionTotalItems as x, recordCollectionPageItems as y };
@@ -11,7 +11,7 @@ let _opentelemetry_semantic_conventions = require("@opentelemetry/semantic-conve
11
11
  let byte_encodings_base64 = require("byte-encodings/base64");
12
12
  //#region deno.json
13
13
  var name = "@fedify/fedify";
14
- var version = "2.3.0-dev.1158+e7295772";
14
+ var version = "2.3.0-dev.1172+8cc8a23f";
15
15
  //#endregion
16
16
  //#region src/sig/accept.ts
17
17
  /**
@@ -179,6 +179,10 @@ var FederationMetrics = class {
179
179
  documentCache;
180
180
  webFingerHandle;
181
181
  webFingerHandleDuration;
182
+ collectionRequest;
183
+ collectionDispatchDuration;
184
+ collectionPageItems;
185
+ collectionTotalItems;
182
186
  constructor(meterProvider) {
183
187
  const meter = meterProvider.getMeter(name, version);
184
188
  this.deliverySent = meter.createCounter("activitypub.delivery.sent", {
@@ -361,6 +365,38 @@ var FederationMetrics = class {
361
365
  1e4
362
366
  ] }
363
367
  });
368
+ this.collectionRequest = meter.createCounter("activitypub.collection.request", {
369
+ description: "ActivityPub collection and collection-page requests handled by Fedify.",
370
+ unit: "{request}"
371
+ });
372
+ this.collectionDispatchDuration = meter.createHistogram("activitypub.collection.dispatch.duration", {
373
+ description: "Duration of ActivityPub collection dispatcher callbacks.",
374
+ unit: "ms",
375
+ advice: { explicitBucketBoundaries: [
376
+ 5,
377
+ 10,
378
+ 25,
379
+ 50,
380
+ 75,
381
+ 100,
382
+ 250,
383
+ 500,
384
+ 750,
385
+ 1e3,
386
+ 2500,
387
+ 5e3,
388
+ 7500,
389
+ 1e4
390
+ ] }
391
+ });
392
+ this.collectionPageItems = meter.createHistogram("activitypub.collection.page.items", {
393
+ description: "Number of items Fedify materialized for an ActivityPub collection response.",
394
+ unit: "{item}"
395
+ });
396
+ this.collectionTotalItems = meter.createHistogram("activitypub.collection.total_items", {
397
+ description: "Total item count reported by ActivityPub collection counters.",
398
+ unit: "{item}"
399
+ });
364
400
  }
365
401
  recordDelivery(inbox, durationMs, success, activityType) {
366
402
  const deliveryAttributes = {
@@ -481,7 +517,29 @@ var FederationMetrics = class {
481
517
  this.webFingerHandle.add(1, attributes);
482
518
  this.webFingerHandleDuration.record(attrs.durationMs, attributes);
483
519
  }
520
+ recordCollectionRequest(attrs) {
521
+ this.collectionRequest.add(1, buildCollectionAttributes(attrs));
522
+ }
523
+ recordCollectionDispatchDuration(durationMs, attrs) {
524
+ this.collectionDispatchDuration.record(durationMs, buildCollectionAttributes(attrs));
525
+ }
526
+ recordCollectionPageItems(itemCount, attrs) {
527
+ this.collectionPageItems.record(itemCount, buildCollectionAttributes(attrs));
528
+ }
529
+ recordCollectionTotalItems(totalItems, attrs) {
530
+ this.collectionTotalItems.record(totalItems, buildCollectionAttributes(attrs));
531
+ }
484
532
  };
533
+ function buildCollectionAttributes(attrs) {
534
+ const attributes = {
535
+ "activitypub.collection.kind": attrs.kind,
536
+ "activitypub.collection.page": attrs.page,
537
+ "activitypub.collection.result": attrs.result,
538
+ "fedify.collection.dispatcher": attrs.dispatcher
539
+ };
540
+ if (attrs.statusCode != null) attributes["http.response.status_code"] = attrs.statusCode;
541
+ return attributes;
542
+ }
485
543
  function buildActivityLifecycleAttributes(result, activityType) {
486
544
  const attributes = { "activitypub.processing.result": result };
487
545
  if (activityType != null) attributes["activitypub.activity.type"] = activityType;
@@ -618,6 +676,38 @@ function recordWebFingerHandle(meterProvider, attrs) {
618
676
  getFederationMetrics(meterProvider).recordWebFingerHandle(attrs);
619
677
  }
620
678
  /**
679
+ * Records one `activitypub.collection.request` measurement for a
680
+ * collection or collection-page request handled by Fedify.
681
+ * @since 2.3.0
682
+ */
683
+ function recordCollectionRequest(meterProvider, attrs) {
684
+ getFederationMetrics(meterProvider).recordCollectionRequest(attrs);
685
+ }
686
+ /**
687
+ * Records one `activitypub.collection.dispatch.duration` measurement for a
688
+ * collection dispatcher callback invocation.
689
+ * @since 2.3.0
690
+ */
691
+ function recordCollectionDispatchDuration(meterProvider, durationMs, attrs) {
692
+ getFederationMetrics(meterProvider).recordCollectionDispatchDuration(durationMs, attrs);
693
+ }
694
+ /**
695
+ * Records one `activitypub.collection.page.items` measurement when Fedify
696
+ * has materialized collection items in memory.
697
+ * @since 2.3.0
698
+ */
699
+ function recordCollectionPageItems(meterProvider, itemCount, attrs) {
700
+ getFederationMetrics(meterProvider).recordCollectionPageItems(itemCount, attrs);
701
+ }
702
+ /**
703
+ * Records one `activitypub.collection.total_items` measurement when a
704
+ * collection counter has already reported a total item count.
705
+ * @since 2.3.0
706
+ */
707
+ function recordCollectionTotalItems(meterProvider, totalItems, attrs) {
708
+ getFederationMetrics(meterProvider).recordCollectionTotalItems(totalItems, attrs);
709
+ }
710
+ /**
621
711
  * Classifies a thrown value from a key or document fetch into the bounded
622
712
  * {@link LookupResult} taxonomy and, when an HTTP response was received,
623
713
  * surfaces its status code.
@@ -2325,6 +2415,30 @@ Object.defineProperty(exports, "parseRfc9421SignatureInput", {
2325
2415
  return parseRfc9421SignatureInput;
2326
2416
  }
2327
2417
  });
2418
+ Object.defineProperty(exports, "recordCollectionDispatchDuration", {
2419
+ enumerable: true,
2420
+ get: function() {
2421
+ return recordCollectionDispatchDuration;
2422
+ }
2423
+ });
2424
+ Object.defineProperty(exports, "recordCollectionPageItems", {
2425
+ enumerable: true,
2426
+ get: function() {
2427
+ return recordCollectionPageItems;
2428
+ }
2429
+ });
2430
+ Object.defineProperty(exports, "recordCollectionRequest", {
2431
+ enumerable: true,
2432
+ get: function() {
2433
+ return recordCollectionRequest;
2434
+ }
2435
+ });
2436
+ Object.defineProperty(exports, "recordCollectionTotalItems", {
2437
+ enumerable: true,
2438
+ get: function() {
2439
+ return recordCollectionTotalItems;
2440
+ }
2441
+ });
2328
2442
  Object.defineProperty(exports, "recordDocumentCache", {
2329
2443
  enumerable: true,
2330
2444
  get: function() {
@@ -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-O_rwum1q.mjs";
5
- import { f as recordKeyLookup, n as getDurationMs, t as classifyFetchError } from "./metrics-oMUWaw6W.mjs";
4
+ import { n as version, t as name } from "./deno-Cb_y5qEi.mjs";
5
+ import { g as recordKeyLookup, n as getDurationMs, t as classifyFetchError } from "./metrics-CKticT28.mjs";
6
6
  import { getLogger } from "@logtape/logtape";
7
7
  import { CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
8
8
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
@@ -1,7 +1,7 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  require("./chunk-DDcVe30Y.cjs");
4
- const require_http = require("./http-DlPd_LYM.cjs");
4
+ const require_http = require("./http-D_HNhC57.cjs");
5
5
  let _logtape_logtape = require("@logtape/logtape");
6
6
  let es_toolkit = require("es-toolkit");
7
7
  let _fedify_vocab_runtime = require("@fedify/vocab-runtime");
@@ -1,7 +1,7 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { c as recordDocumentCache } from "./metrics-oMUWaw6W.mjs";
4
+ import { f as recordDocumentCache } from "./metrics-CKticT28.mjs";
5
5
  import { getLogger } from "@logtape/logtape";
6
6
  import { preloadedContexts } from "@fedify/vocab-runtime";
7
7
  //#region src/utils/kv-cache.ts
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { d as validateCryptoKey, t as doubleKnock, v as recordDocumentCache } from "./http-CFP8WMMv.js";
3
+ import { S as recordDocumentCache, d as validateCryptoKey, t as doubleKnock } from "./http-C0XZv7iH.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
  import { curry } from "es-toolkit";
6
6
  import { UrlError, createActivityPubRequest, getRemoteDocument, logRequest, preloadedContexts, validatePublicUrl } from "@fedify/vocab-runtime";
@@ -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-O_rwum1q.mjs";
5
- import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-oMUWaw6W.mjs";
6
- import { n as fetchKey, o as validateCryptoKey } from "./key-DyATZSWG.mjs";
4
+ import { n as version, t as name } from "./deno-Cb_y5qEi.mjs";
5
+ import { n as getDurationMs, r as getFederationMetrics, s as measureSignatureKeyFetch } from "./metrics-CKticT28.mjs";
6
+ import { n as fetchKey, o as validateCryptoKey } from "./key-Cl_bixZo.mjs";
7
7
  import { getLogger } from "@logtape/logtape";
8
8
  import { Activity, CryptographicKey, Object as Object$1, getTypeId } from "@fedify/vocab";
9
9
  import { SpanStatusCode, trace } from "@opentelemetry/api";
@@ -1,7 +1,7 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-O_rwum1q.mjs";
4
+ import { n as version, t as name } from "./deno-Cb_y5qEi.mjs";
5
5
  import { metrics } from "@opentelemetry/api";
6
6
  import { FetchError } from "@fedify/vocab-runtime";
7
7
  //#region src/federation/metrics.ts
@@ -31,6 +31,10 @@ var FederationMetrics = class {
31
31
  documentCache;
32
32
  webFingerHandle;
33
33
  webFingerHandleDuration;
34
+ collectionRequest;
35
+ collectionDispatchDuration;
36
+ collectionPageItems;
37
+ collectionTotalItems;
34
38
  constructor(meterProvider) {
35
39
  const meter = meterProvider.getMeter(name, version);
36
40
  this.deliverySent = meter.createCounter("activitypub.delivery.sent", {
@@ -213,6 +217,38 @@ var FederationMetrics = class {
213
217
  1e4
214
218
  ] }
215
219
  });
220
+ this.collectionRequest = meter.createCounter("activitypub.collection.request", {
221
+ description: "ActivityPub collection and collection-page requests handled by Fedify.",
222
+ unit: "{request}"
223
+ });
224
+ this.collectionDispatchDuration = meter.createHistogram("activitypub.collection.dispatch.duration", {
225
+ description: "Duration of ActivityPub collection dispatcher callbacks.",
226
+ unit: "ms",
227
+ advice: { explicitBucketBoundaries: [
228
+ 5,
229
+ 10,
230
+ 25,
231
+ 50,
232
+ 75,
233
+ 100,
234
+ 250,
235
+ 500,
236
+ 750,
237
+ 1e3,
238
+ 2500,
239
+ 5e3,
240
+ 7500,
241
+ 1e4
242
+ ] }
243
+ });
244
+ this.collectionPageItems = meter.createHistogram("activitypub.collection.page.items", {
245
+ description: "Number of items Fedify materialized for an ActivityPub collection response.",
246
+ unit: "{item}"
247
+ });
248
+ this.collectionTotalItems = meter.createHistogram("activitypub.collection.total_items", {
249
+ description: "Total item count reported by ActivityPub collection counters.",
250
+ unit: "{item}"
251
+ });
216
252
  }
217
253
  recordDelivery(inbox, durationMs, success, activityType) {
218
254
  const deliveryAttributes = {
@@ -333,7 +369,29 @@ var FederationMetrics = class {
333
369
  this.webFingerHandle.add(1, attributes);
334
370
  this.webFingerHandleDuration.record(attrs.durationMs, attributes);
335
371
  }
372
+ recordCollectionRequest(attrs) {
373
+ this.collectionRequest.add(1, buildCollectionAttributes(attrs));
374
+ }
375
+ recordCollectionDispatchDuration(durationMs, attrs) {
376
+ this.collectionDispatchDuration.record(durationMs, buildCollectionAttributes(attrs));
377
+ }
378
+ recordCollectionPageItems(itemCount, attrs) {
379
+ this.collectionPageItems.record(itemCount, buildCollectionAttributes(attrs));
380
+ }
381
+ recordCollectionTotalItems(totalItems, attrs) {
382
+ this.collectionTotalItems.record(totalItems, buildCollectionAttributes(attrs));
383
+ }
336
384
  };
385
+ function buildCollectionAttributes(attrs) {
386
+ const attributes = {
387
+ "activitypub.collection.kind": attrs.kind,
388
+ "activitypub.collection.page": attrs.page,
389
+ "activitypub.collection.result": attrs.result,
390
+ "fedify.collection.dispatcher": attrs.dispatcher
391
+ };
392
+ if (attrs.statusCode != null) attributes["http.response.status_code"] = attrs.statusCode;
393
+ return attributes;
394
+ }
337
395
  function buildActivityLifecycleAttributes(result, activityType) {
338
396
  const attributes = { "activitypub.processing.result": result };
339
397
  if (activityType != null) attributes["activitypub.activity.type"] = activityType;
@@ -470,6 +528,38 @@ function recordWebFingerHandle(meterProvider, attrs) {
470
528
  getFederationMetrics(meterProvider).recordWebFingerHandle(attrs);
471
529
  }
472
530
  /**
531
+ * Records one `activitypub.collection.request` measurement for a
532
+ * collection or collection-page request handled by Fedify.
533
+ * @since 2.3.0
534
+ */
535
+ function recordCollectionRequest(meterProvider, attrs) {
536
+ getFederationMetrics(meterProvider).recordCollectionRequest(attrs);
537
+ }
538
+ /**
539
+ * Records one `activitypub.collection.dispatch.duration` measurement for a
540
+ * collection dispatcher callback invocation.
541
+ * @since 2.3.0
542
+ */
543
+ function recordCollectionDispatchDuration(meterProvider, durationMs, attrs) {
544
+ getFederationMetrics(meterProvider).recordCollectionDispatchDuration(durationMs, attrs);
545
+ }
546
+ /**
547
+ * Records one `activitypub.collection.page.items` measurement when Fedify
548
+ * has materialized collection items in memory.
549
+ * @since 2.3.0
550
+ */
551
+ function recordCollectionPageItems(meterProvider, itemCount, attrs) {
552
+ getFederationMetrics(meterProvider).recordCollectionPageItems(itemCount, attrs);
553
+ }
554
+ /**
555
+ * Records one `activitypub.collection.total_items` measurement when a
556
+ * collection counter has already reported a total item count.
557
+ * @since 2.3.0
558
+ */
559
+ function recordCollectionTotalItems(meterProvider, totalItems, attrs) {
560
+ getFederationMetrics(meterProvider).recordCollectionTotalItems(totalItems, attrs);
561
+ }
562
+ /**
473
563
  * Classifies a thrown value from a key or document fetch into the bounded
474
564
  * {@link LookupResult} taxonomy and, when an HTTP response was received,
475
565
  * surfaces its status code.
@@ -632,4 +722,4 @@ function getDurationMs(start) {
632
722
  return Math.max(0, performance.now() - start);
633
723
  }
634
724
  //#endregion
635
- export { instrumentDocumentLoader as a, recordDocumentCache as c, recordInboxActivity as d, recordKeyLookup as f, recordWebFingerHandle as h, getRemoteHost as i, recordDocumentFetch as l, recordOutboxEnqueue as m, getDurationMs as n, isAbortError as o, recordOutboxActivity as p, getFederationMetrics as r, measureSignatureKeyFetch as s, classifyFetchError as t, recordFanoutRecipients as u };
725
+ export { recordOutboxActivity as _, instrumentDocumentLoader as a, recordCollectionDispatchDuration as c, recordCollectionTotalItems as d, recordDocumentCache as f, recordKeyLookup as g, recordInboxActivity as h, getRemoteHost as i, recordCollectionPageItems as l, recordFanoutRecipients as m, getDurationMs as n, isAbortError as o, recordDocumentFetch as p, getFederationMetrics as r, measureSignatureKeyFetch as s, classifyFetchError as t, recordCollectionRequest as u, recordOutboxEnqueue as v, recordWebFingerHandle as y };