@fedify/fedify 2.3.0-dev.1212 → 2.3.0-dev.1213

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/dist/{builder-DdbtvTFp.mjs → builder-Bj-7Sl7u.mjs} +9 -2
  2. package/dist/compat/mod.d.cts +1 -1
  3. package/dist/compat/mod.d.ts +1 -1
  4. package/dist/compat/outgoing-jsonld.test.mjs +1 -1
  5. package/dist/compat/public-audience.test.mjs +1 -1
  6. package/dist/compat/transformers.test.mjs +2 -2
  7. package/dist/{context-DMHK7jqX.d.cts → context-BBVLF7lx.d.cts} +41 -2
  8. package/dist/{context-K9cg8oGx.d.ts → context-BU6jSQdo.d.ts} +42 -2
  9. package/dist/{deno-DTaoLXHr.mjs → deno-BUzynMVz.mjs} +1 -1
  10. package/dist/{docloader-CdNiXmNg.mjs → docloader-jQPthO4U.mjs} +2 -2
  11. package/dist/{esm-BQRw925N.mjs → esm-vrlUxr60.mjs} +23 -1
  12. package/dist/federation/builder.test.mjs +21 -2
  13. package/dist/federation/circuit-breaker.test.mjs +1 -1
  14. package/dist/federation/handler.test.mjs +6 -6
  15. package/dist/federation/idempotency.test.mjs +4 -4
  16. package/dist/federation/keycache.test.mjs +1 -1
  17. package/dist/federation/kv.test.mjs +1 -1
  18. package/dist/federation/metrics.test.mjs +147 -1
  19. package/dist/federation/middleware.test.mjs +446 -18
  20. package/dist/federation/mod.cjs +1 -1
  21. package/dist/federation/mod.d.cts +3 -3
  22. package/dist/federation/mod.d.ts +3 -3
  23. package/dist/federation/mod.js +1 -1
  24. package/dist/federation/send.test.mjs +8 -4426
  25. package/dist/federation/temporal.test.mjs +1 -1
  26. package/dist/federation/webfinger.test.mjs +2 -2
  27. package/dist/{http-Czeyq7if.cjs → http-B1zlPuh3.cjs} +79 -2
  28. package/dist/{http-BEG9kx13.js → http-B_WbYMnB.js} +74 -3
  29. package/dist/{http-ByCfCX5K.mjs → http-CDaMGwCP.mjs} +4 -4
  30. package/dist/{key-Bhsx9PrC.mjs → key-DdP4HxTK.mjs} +2 -2
  31. package/dist/{kv-cache-qRBN2G2Z.cjs → kv-cache-CPIfTWt5.cjs} +1 -1
  32. package/dist/{kv-cache-D9U1AnXH.js → kv-cache-CXo8QM4m.js} +1 -1
  33. package/dist/{kv-cache-D4jzgeYW.mjs → kv-cache-DSjv5Aeh.mjs} +1 -1
  34. package/dist/{ld-CHtLb_Uh.mjs → ld-CuOEh5aB.mjs} +3 -3
  35. package/dist/{metrics-uwSF8DLC.mjs → metrics-B5vvJYMV.mjs} +74 -3
  36. package/dist/{middleware-BmSzD5U9.mjs → middleware-Cq9S8A5O.mjs} +328 -24
  37. package/dist/{middleware-CyiBzIwY.mjs → middleware-DPE-IRlD.mjs} +1 -1
  38. package/dist/{middleware-DrKDd2JT.js → middleware-Dft_sYeS.js} +352 -41
  39. package/dist/{middleware-CRORNnSU.cjs → middleware-DlqW4IRW.cjs} +351 -40
  40. package/dist/{mod-YLnSsEHY.d.cts → mod-C0F6kvgS.d.cts} +1 -1
  41. package/dist/{mod-CfOFqS0w.d.ts → mod-vPYVoa5n.d.ts} +1 -1
  42. package/dist/mod.cjs +4 -4
  43. package/dist/mod.d.cts +4 -4
  44. package/dist/mod.d.ts +4 -4
  45. package/dist/mod.js +4 -4
  46. package/dist/nodeinfo/client.test.mjs +2 -2
  47. package/dist/nodeinfo/handler.test.mjs +2 -2
  48. package/dist/nodeinfo/types.test.mjs +1 -1
  49. package/dist/otel/exporter.test.mjs +1 -1
  50. package/dist/{outgoing-jsonld-BgFLCJQ_.mjs → outgoing-jsonld-L_DbOaFe.mjs} +1 -1
  51. package/dist/{owner-B0Zrhs0w.mjs → owner--n8rmG51.mjs} +2 -2
  52. package/dist/{proof-frzCtYji.cjs → proof-BKpJ_p_d.cjs} +1 -1
  53. package/dist/{proof-CZhAX94C.js → proof-BsvB1vGI.js} +1 -1
  54. package/dist/{proof-DbJFxpzD.mjs → proof-dhtwaP4z.mjs} +5 -5
  55. package/dist/{send-kst2L0Df.mjs → send-CTQ30Wbe.mjs} +3 -3
  56. package/dist/sig/accept.test.mjs +1 -1
  57. package/dist/sig/http.test.mjs +4 -4
  58. package/dist/sig/key.test.mjs +2 -2
  59. package/dist/sig/ld.test.mjs +3 -3
  60. package/dist/sig/mod.cjs +2 -2
  61. package/dist/sig/mod.js +2 -2
  62. package/dist/sig/owner.test.mjs +2 -2
  63. package/dist/sig/proof.test.mjs +3 -3
  64. package/dist/{temporal-CcGypkzd.mjs → temporal-gfUaZjGU.mjs} +1 -1
  65. package/dist/testing/mod.d.mts +1 -0
  66. package/dist/utils/docloader.test.mjs +4 -4
  67. package/dist/utils/kv-cache.test.mjs +1 -1
  68. package/dist/utils/mod.cjs +1 -1
  69. package/dist/utils/mod.js +1 -1
  70. package/package.json +7 -7
  71. package/dist/chunk-DNRtMIoB.mjs +0 -29
  72. package/dist/execAsync-Dmet7-28.mjs +0 -13
  73. package/dist/getMachineId-bsd-Bn0le7-J.mjs +0 -29
  74. package/dist/getMachineId-darwin-CVjKuDgj.mjs +0 -26
  75. package/dist/getMachineId-linux-DbG4BXa-.mjs +0 -22
  76. package/dist/getMachineId-unsupported-lC8T9hPE.mjs +0 -17
  77. package/dist/getMachineId-win-c5zxTSS1.mjs +0 -28
  78. /package/dist/{accept-CceiKpCy.mjs → accept-CPkZzmGN.mjs} +0 -0
  79. /package/dist/{client-B_A6mfn3.mjs → client-ByXmQhYD.mjs} +0 -0
  80. /package/dist/{keys-C3kae-6B.mjs → keys-DGu1NFwu.mjs} +0 -0
  81. /package/dist/{kv-x2IvBUyq.mjs → kv-rV3vodCc.mjs} +0 -0
  82. /package/dist/{public-audience-N3pyOx2p.mjs → public-audience-Cvbr2Gzt.mjs} +0 -0
  83. /package/dist/{types-BFowWFTT.mjs → types-J53Kw7so.mjs} +0 -0
@@ -1,6 +1,7 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
+ import { t as esm_default } from "../esm-vrlUxr60.mjs";
4
5
  import { t as assertEquals } from "../assert_equals-C-ZRDbaf.mjs";
5
6
  import { r as assertExists } from "../std__assert-BBjXFNOb.mjs";
6
7
  import { r as assertFalse, t as assertRejects } from "../assert_rejects-DN60FHPX.mjs";
@@ -9,24 +10,25 @@ import { t as assertThrows } from "../assert_throws-BOkhLGYc.mjs";
9
10
  import { t as assertNotEquals } from "../assert_not_equals-DkVK8oqV.mjs";
10
11
  import { t as assertStrictEquals } from "../assert_strict_equals-XEgZAlrj.mjs";
11
12
  import { t as assert } from "../assert-OguE97r2.mjs";
12
- import { t as esm_default } from "../esm-BQRw925N.mjs";
13
- import { l as verifyRequest, s as signRequest } from "../http-ByCfCX5K.mjs";
14
- import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-C3kae-6B.mjs";
15
- import { t as getAuthenticatedDocumentLoader } from "../docloader-CdNiXmNg.mjs";
16
- import { a as compactJsonLd, h as verifyJsonLd, p as signJsonLd, s as detachSignature } from "../ld-CHtLb_Uh.mjs";
17
- import { t as doesActorOwnKey } from "../owner-B0Zrhs0w.mjs";
18
- import { i as verifyObject, r as signObject } from "../proof-DbJFxpzD.mjs";
19
- import { t as MemoryKvStore } from "../kv-x2IvBUyq.mjs";
20
- import { i as KvSpecDeterminer, n as FederationImpl, o as createFederation, r as InboxContextImpl, t as ContextImpl } from "../middleware-BmSzD5U9.mjs";
13
+ import { g as recordInboxActivity } from "../metrics-B5vvJYMV.mjs";
14
+ import { l as verifyRequest, s as signRequest } from "../http-CDaMGwCP.mjs";
15
+ import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-DGu1NFwu.mjs";
16
+ import { t as getAuthenticatedDocumentLoader } from "../docloader-jQPthO4U.mjs";
17
+ import { a as compactJsonLd, h as verifyJsonLd, p as signJsonLd, s as detachSignature } from "../ld-CuOEh5aB.mjs";
18
+ import { t as doesActorOwnKey } from "../owner--n8rmG51.mjs";
19
+ import { i as verifyObject, r as signObject } from "../proof-dhtwaP4z.mjs";
20
+ import { t as MemoryKvStore } from "../kv-rV3vodCc.mjs";
21
+ import { g as handleBenchmarkTrigger, i as KvSpecDeterminer, n as FederationImpl, o as createFederation, r as InboxContextImpl, t as ContextImpl } from "../middleware-Cq9S8A5O.mjs";
21
22
  import { t as CircuitBreaker } from "../circuit-breaker-CSWsyoef.mjs";
22
23
  import { configure, reset } from "@logtape/logtape";
23
24
  import { RouterError } from "@fedify/uri-template";
24
25
  import * as vocab from "@fedify/vocab";
25
26
  import { Create, Offer, Person, getTypeId, lookupObject } from "@fedify/vocab";
26
- import { SpanStatusCode } from "@opentelemetry/api";
27
+ import { SpanStatusCode, metrics } from "@opentelemetry/api";
27
28
  import { createTestMeterProvider, createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
28
29
  import { FetchError, getDocumentLoader } from "@fedify/vocab-runtime";
29
30
  import serialize from "json-canon";
31
+ import { DataPointType, MeterProvider as MeterProvider$1, MetricReader } from "@opentelemetry/sdk-metrics";
30
32
  //#region ../fixture/src/fixtures/example.com/create.json
31
33
  var id$2 = "https://example.com/create";
32
34
  var create_default = {
@@ -98,6 +100,14 @@ async function withLogtapeLock(fn) {
98
100
  logtapeLock = run.then(() => void 0, () => void 0);
99
101
  return await run;
100
102
  }
103
+ var TestMetricReader = class extends MetricReader {
104
+ onShutdown() {
105
+ return Promise.resolve();
106
+ }
107
+ onForceFlush() {
108
+ return Promise.resolve();
109
+ }
110
+ };
101
111
  test("createFederation()", async (t) => {
102
112
  const kv = new MemoryKvStore();
103
113
  await t.step("allowPrivateAddress", () => {
@@ -112,6 +122,104 @@ test("createFederation()", async (t) => {
112
122
  allowPrivateAddress: true
113
123
  }), TypeError);
114
124
  });
125
+ await t.step("benchmarkMode applies cooperative benchmark defaults", () => {
126
+ const federation = createFederation({
127
+ kv,
128
+ benchmarkMode: true
129
+ });
130
+ assertInstanceOf(federation, FederationImpl);
131
+ assertEquals(federation.allowPrivateAddress, true);
132
+ assertEquals(federation.signatureTimeWindow, false);
133
+ });
134
+ await t.step("benchmarkMode preserves explicit option overrides", () => {
135
+ const federation = createFederation({
136
+ kv,
137
+ benchmarkMode: true,
138
+ allowPrivateAddress: false,
139
+ signatureTimeWindow: { minutes: 10 }
140
+ });
141
+ assertInstanceOf(federation, FederationImpl);
142
+ assertEquals(federation.allowPrivateAddress, false);
143
+ assertEquals(federation.signatureTimeWindow, { minutes: 10 });
144
+ });
145
+ await t.step("benchmarkMode tolerates calendar time windows", () => {
146
+ const federation = createFederation({
147
+ kv,
148
+ benchmarkMode: true,
149
+ signatureTimeWindow: { months: 1 }
150
+ });
151
+ assertInstanceOf(federation, FederationImpl);
152
+ assertEquals(federation.signatureTimeWindow, { months: 1 });
153
+ });
154
+ await t.step("benchmarkMode leaves custom loader factories alone", () => {
155
+ const federation = createFederation({
156
+ kv,
157
+ benchmarkMode: true,
158
+ documentLoaderFactory: () => mockDocumentLoader,
159
+ contextLoaderFactory: () => mockDocumentLoader,
160
+ authenticatedDocumentLoaderFactory: () => mockDocumentLoader
161
+ });
162
+ assertInstanceOf(federation, FederationImpl);
163
+ assertEquals(federation.allowPrivateAddress, false);
164
+ });
165
+ await t.step("benchmarkMode keeps private-address default with auth loader only", () => {
166
+ const federation = createFederation({
167
+ kv,
168
+ benchmarkMode: true,
169
+ authenticatedDocumentLoaderFactory: () => mockDocumentLoader
170
+ });
171
+ assertInstanceOf(federation, FederationImpl);
172
+ assertEquals(federation.allowPrivateAddress, true);
173
+ });
174
+ await t.step("benchmarkMode rejects an explicit meterProvider", () => {
175
+ const [meterProvider] = createTestMeterProvider();
176
+ assertThrows(() => createFederation({
177
+ kv,
178
+ benchmarkMode: true,
179
+ meterProvider
180
+ }), TypeError, "benchmarkMode requires Fedify to own the meterProvider");
181
+ });
182
+ await t.step("benchmarkMode warns that benchmark-only relaxations are on", async () => {
183
+ await withLogtapeLock(async () => {
184
+ const records = [];
185
+ await reset();
186
+ try {
187
+ await configure({
188
+ sinks: { test(record) {
189
+ records.push(record);
190
+ } },
191
+ loggers: [{
192
+ category: [
193
+ "fedify",
194
+ "federation",
195
+ "benchmark"
196
+ ],
197
+ lowestLevel: "warning",
198
+ sinks: ["test"]
199
+ }]
200
+ });
201
+ createFederation({
202
+ kv,
203
+ benchmarkMode: true
204
+ });
205
+ assertEquals(records.length, 1);
206
+ assertEquals(records[0].level, "warning");
207
+ assertEquals(records[0].rawMessage, "Fedify benchmarkMode is enabled; private address checks disabled (allowPrivateAddress=true); HTTP Signature time window disabled (signatureTimeWindow=false). Benchmark endpoints are active and must not be used in production.");
208
+ assertEquals(records[0].properties.relaxations, [{
209
+ protection: "private_address_checks",
210
+ effect: "disabled",
211
+ effectiveValue: true
212
+ }, {
213
+ protection: "http_signature_time_window",
214
+ effect: "disabled",
215
+ effectiveValue: false,
216
+ secureDefaultSeconds: 3600
217
+ }]);
218
+ } finally {
219
+ await reset();
220
+ }
221
+ });
222
+ });
115
223
  await t.step("origin", () => {
116
224
  const f = createFederation({
117
225
  kv,
@@ -205,6 +313,319 @@ test("createFederation()", async (t) => {
205
313
  }), TypeError);
206
314
  });
207
315
  });
316
+ test("benchmarkMode stats endpoint", async (t) => {
317
+ await t.step("is absent when benchmarkMode is off", async () => {
318
+ assertEquals((await createFederation({ kv: new MemoryKvStore() }).fetch(new Request("https://example.com/.well-known/fedify/bench/stats"), { contextData: void 0 })).status, 404);
319
+ });
320
+ await t.step("returns a v1 in-process metrics snapshot", async () => {
321
+ const federation = createFederation({
322
+ kv: new MemoryKvStore(),
323
+ benchmarkMode: true,
324
+ queue: {
325
+ enqueue() {
326
+ return Promise.resolve();
327
+ },
328
+ listen() {
329
+ return Promise.resolve();
330
+ },
331
+ getDepth() {
332
+ return Promise.resolve({
333
+ queued: 3,
334
+ ready: 2,
335
+ delayed: 1
336
+ });
337
+ }
338
+ }
339
+ });
340
+ recordInboxActivity(federation.meterProvider, "processed", vocab.Create.typeId.href);
341
+ const response = await federation.fetch(new Request("https://example.com/.well-known/fedify/bench/stats"), { contextData: void 0 });
342
+ assertEquals(response.status, 200);
343
+ assertEquals(response.headers.get("Content-Type"), "application/json");
344
+ const body = await response.json();
345
+ assertEquals(body.version, 1);
346
+ assertEquals(body.source, "server");
347
+ assertEquals(Number.isNaN(Date.parse(body.generatedAt)), false);
348
+ const metrics = body.scopeMetrics.flatMap((scope) => scope.metrics);
349
+ assertExists(metrics.find((metric) => metric.name === "activitypub.inbox.activity"));
350
+ const queueDepth = metrics.find((metric) => metric.name === "fedify.queue.depth");
351
+ assertExists(queueDepth);
352
+ assertEquals(queueDepth.dataPointType, "gauge");
353
+ assertEquals(queueDepth.dataPoints.map((point) => ({
354
+ state: point.attributes["fedify.queue.depth.state"],
355
+ role: point.attributes["fedify.queue.role"],
356
+ value: point.value
357
+ })).sort((a, b) => String(a.state).localeCompare(String(b.state))), [
358
+ {
359
+ state: "delayed",
360
+ role: "shared",
361
+ value: 1
362
+ },
363
+ {
364
+ state: "queued",
365
+ role: "shared",
366
+ value: 3
367
+ },
368
+ {
369
+ state: "ready",
370
+ role: "shared",
371
+ value: 2
372
+ }
373
+ ]);
374
+ });
375
+ });
376
+ test("createFederation() registers queue depth for regular metrics", async () => {
377
+ const reader = new TestMetricReader();
378
+ const meterProvider = new MeterProvider$1({ readers: [reader] });
379
+ try {
380
+ createFederation({
381
+ kv: new MemoryKvStore(),
382
+ meterProvider,
383
+ queue: {
384
+ enqueue() {
385
+ return Promise.resolve();
386
+ },
387
+ listen() {
388
+ return Promise.resolve();
389
+ },
390
+ getDepth() {
391
+ return Promise.resolve({
392
+ queued: 5,
393
+ ready: 4,
394
+ delayed: 3
395
+ });
396
+ }
397
+ }
398
+ });
399
+ const queueDepth = (await reader.collect()).resourceMetrics.scopeMetrics.flatMap((scope) => scope.metrics).find((metric) => metric.descriptor.name === "fedify.queue.depth");
400
+ assertExists(queueDepth);
401
+ assertEquals(queueDepth.dataPointType, DataPointType.GAUGE);
402
+ assertEquals(queueDepth.dataPoints.map((point) => ({
403
+ state: point.attributes["fedify.queue.depth.state"],
404
+ role: point.attributes["fedify.queue.role"],
405
+ value: point.value
406
+ })).sort((a, b) => String(a.state).localeCompare(String(b.state))), [
407
+ {
408
+ state: "delayed",
409
+ role: "shared",
410
+ value: 3
411
+ },
412
+ {
413
+ state: "queued",
414
+ role: "shared",
415
+ value: 5
416
+ },
417
+ {
418
+ state: "ready",
419
+ role: "shared",
420
+ value: 4
421
+ }
422
+ ]);
423
+ } finally {
424
+ await meterProvider.shutdown();
425
+ }
426
+ });
427
+ test("createFederation() registers queue depth after global meterProvider is set", async () => {
428
+ metrics.disable();
429
+ const federation = createFederation({
430
+ kv: new MemoryKvStore(),
431
+ queue: {
432
+ enqueue() {
433
+ return Promise.resolve();
434
+ },
435
+ listen() {
436
+ return Promise.resolve();
437
+ },
438
+ getDepth() {
439
+ return Promise.resolve({ queued: 8 });
440
+ }
441
+ }
442
+ });
443
+ const reader = new TestMetricReader();
444
+ const meterProvider = new MeterProvider$1({ readers: [reader] });
445
+ try {
446
+ metrics.setGlobalMeterProvider(meterProvider);
447
+ federation.meterProvider;
448
+ const queueDepth = (await reader.collect()).resourceMetrics.scopeMetrics.flatMap((scope) => scope.metrics).find((metric) => metric.descriptor.name === "fedify.queue.depth");
449
+ assertExists(queueDepth);
450
+ assertEquals(queueDepth.dataPointType, DataPointType.GAUGE);
451
+ assertEquals(queueDepth.dataPoints.map((point) => ({
452
+ state: point.attributes["fedify.queue.depth.state"],
453
+ role: point.attributes["fedify.queue.role"],
454
+ value: point.value
455
+ })), [{
456
+ state: "queued",
457
+ role: "shared",
458
+ value: 8
459
+ }]);
460
+ } finally {
461
+ metrics.disable();
462
+ await meterProvider.shutdown();
463
+ }
464
+ });
465
+ test("createFederation() distinguishes queue depth series per federation", async () => {
466
+ const reader = new TestMetricReader();
467
+ const meterProvider = new MeterProvider$1({ readers: [reader] });
468
+ try {
469
+ const createQueue = (queued) => ({
470
+ enqueue() {
471
+ return Promise.resolve();
472
+ },
473
+ listen() {
474
+ return Promise.resolve();
475
+ },
476
+ getDepth() {
477
+ return Promise.resolve({ queued });
478
+ }
479
+ });
480
+ createFederation({
481
+ kv: new MemoryKvStore(),
482
+ meterProvider,
483
+ queue: createQueue(1)
484
+ });
485
+ createFederation({
486
+ kv: new MemoryKvStore(),
487
+ meterProvider,
488
+ queue: createQueue(2)
489
+ });
490
+ const queueDepth = (await reader.collect()).resourceMetrics.scopeMetrics.flatMap((scope) => scope.metrics).find((metric) => metric.descriptor.name === "fedify.queue.depth");
491
+ assertExists(queueDepth);
492
+ const queuedPoints = queueDepth.dataPoints.filter((point) => point.attributes["fedify.queue.depth.state"] === "queued");
493
+ assertEquals(queuedPoints.map((point) => point.value).sort(), [1, 2]);
494
+ const instanceIds = queuedPoints.map((point) => point.attributes["fedify.federation.instance_id"]);
495
+ assertEquals(instanceIds.every((id) => typeof id === "string"), true);
496
+ assertEquals(new Set(instanceIds).size, 2);
497
+ } finally {
498
+ await meterProvider.shutdown();
499
+ }
500
+ });
501
+ test("benchmarkMode trigger endpoint", async (t) => {
502
+ const createTriggerTarget = (options = {}) => {
503
+ const messages = [];
504
+ const federation = createFederation({
505
+ kv: new MemoryKvStore(),
506
+ benchmarkMode: {
507
+ triggerSinks: ["https://sink.example/inbox"],
508
+ allowUnsafeTriggerRecipients: options.allowUnsafeTriggerRecipients
509
+ },
510
+ contextLoaderFactory: () => mockDocumentLoader,
511
+ queue: { outbox: {
512
+ enqueue(message) {
513
+ messages.push(message);
514
+ return Promise.resolve();
515
+ },
516
+ listen() {
517
+ return Promise.resolve();
518
+ }
519
+ } }
520
+ });
521
+ federation.setActorDispatcher("/users/{identifier}", (ctx, identifier) => new vocab.Person({
522
+ id: ctx.getActorUri(identifier),
523
+ inbox: ctx.getInboxUri(identifier)
524
+ })).setKeyPairsDispatcher(() => [{
525
+ privateKey: rsaPrivateKey2,
526
+ publicKey: rsaPublicKey2.publicKey
527
+ }]);
528
+ return {
529
+ federation,
530
+ messages
531
+ };
532
+ };
533
+ const createTriggerBody = async (options = {}) => ({
534
+ sender: { identifier: "alice" },
535
+ sinks: options.sinks,
536
+ recipients: options.recipients ?? [{
537
+ "@context": "https://www.w3.org/ns/activitystreams",
538
+ type: "Service",
539
+ id: "https://sink.example/actors/bob",
540
+ inbox: options.recipientInbox ?? "https://sink.example/inbox"
541
+ }],
542
+ activity: await new vocab.Create({
543
+ id: new URL("https://example.com/activities/bench-1"),
544
+ actor: new URL("https://example.com/users/alice"),
545
+ object: new vocab.Note({
546
+ id: new URL("https://example.com/notes/bench-1"),
547
+ attribution: new URL("https://example.com/users/alice"),
548
+ content: "benchmark"
549
+ })
550
+ }).toJsonLd({ contextLoader: mockDocumentLoader }),
551
+ allowUnsafeRecipients: options.allowUnsafeRecipients
552
+ });
553
+ await t.step("is absent when benchmarkMode is off", async () => {
554
+ assertEquals((await createFederation({ kv: new MemoryKvStore() }).fetch(new Request("https://example.com/.well-known/fedify/bench/trigger", { method: "POST" }), { contextData: void 0 })).status, 404);
555
+ });
556
+ await t.step("rejects unreadable JSON request bodies", async () => {
557
+ const response = await handleBenchmarkTrigger({
558
+ method: "POST",
559
+ json() {
560
+ throw new TypeError("body is unavailable");
561
+ }
562
+ }, {});
563
+ assertEquals(response.status, 400);
564
+ assertEquals(await response.json(), { error: "Invalid JSON request body." });
565
+ });
566
+ await t.step("rejects empty recipient lists", async () => {
567
+ const { federation, messages } = createTriggerTarget();
568
+ const response = await federation.fetch(new Request("https://example.com/.well-known/fedify/bench/trigger", {
569
+ method: "POST",
570
+ headers: { "Content-Type": "application/json" },
571
+ body: JSON.stringify(await createTriggerBody({ recipients: [] }))
572
+ }), { contextData: void 0 });
573
+ assertEquals(response.status, 400);
574
+ assertEquals(await response.json(), { error: "No valid recipient inboxes found. The recipients list must not be empty." });
575
+ assertEquals(messages, []);
576
+ });
577
+ await t.step("rejects recipients outside configured trigger sinks", async () => {
578
+ const { federation, messages } = createTriggerTarget();
579
+ assertEquals((await federation.fetch(new Request("https://example.com/.well-known/fedify/bench/trigger", {
580
+ method: "POST",
581
+ headers: { "Content-Type": "application/json" },
582
+ body: JSON.stringify(await createTriggerBody({ recipientInbox: "https://not-a-sink.example/inbox" }))
583
+ }), { contextData: void 0 })).status, 403);
584
+ assertEquals(messages, []);
585
+ });
586
+ await t.step("does not trust request-provided trigger sinks or bypasses", async () => {
587
+ const { federation, messages } = createTriggerTarget();
588
+ assertEquals((await federation.fetch(new Request("https://example.com/.well-known/fedify/bench/trigger", {
589
+ method: "POST",
590
+ headers: { "Content-Type": "application/json" },
591
+ body: JSON.stringify(await createTriggerBody({
592
+ recipientInbox: "https://not-a-sink.example/inbox",
593
+ sinks: ["https://not-a-sink.example/inbox"],
594
+ allowUnsafeRecipients: true
595
+ }))
596
+ }), { contextData: void 0 })).status, 403);
597
+ assertEquals(messages, []);
598
+ });
599
+ await t.step("allows unsafe recipients only with a server override", async () => {
600
+ const { federation, messages } = createTriggerTarget({ allowUnsafeTriggerRecipients: true });
601
+ assertEquals((await federation.fetch(new Request("https://example.com/.well-known/fedify/bench/trigger", {
602
+ method: "POST",
603
+ headers: { "Content-Type": "application/json" },
604
+ body: JSON.stringify(await createTriggerBody({ recipientInbox: "https://not-a-sink.example/inbox" }))
605
+ }), { contextData: void 0 })).status, 202);
606
+ assertEquals(messages.length, 1);
607
+ assertEquals(messages[0].inbox, "https://not-a-sink.example/inbox");
608
+ });
609
+ await t.step("sends the activity to explicit sink recipients", async () => {
610
+ const { federation, messages } = createTriggerTarget();
611
+ const response = await federation.fetch(new Request("https://example.com/.well-known/fedify/bench/trigger", {
612
+ method: "POST",
613
+ headers: { "Content-Type": "application/json" },
614
+ body: JSON.stringify(await createTriggerBody())
615
+ }), { contextData: void 0 });
616
+ assertEquals(response.status, 202);
617
+ const body = await response.json();
618
+ assertEquals(body.version, 1);
619
+ assertEquals(body.activityId, "https://example.com/activities/bench-1");
620
+ assertEquals(body.queueCorrelationId, "https://example.com/activities/bench-1");
621
+ assertEquals(body.recipientCount, 1);
622
+ assertEquals(body.inboxCount, 1);
623
+ assertEquals(messages.length, 1);
624
+ assertEquals(messages[0].type, "outbox");
625
+ assertEquals(messages[0].activityId, body.queueCorrelationId);
626
+ assertEquals(messages[0].inbox, "https://sink.example/inbox");
627
+ });
628
+ });
208
629
  test({
209
630
  name: "Federation.createContext()",
210
631
  permissions: {
@@ -4995,15 +5416,22 @@ test("FederationImpl.processQueuedTask() circuit breaker", async (t) => {
4995
5416
  await t.step("expired held activity is dropped", async () => {
4996
5417
  esm_default.hardReset();
4997
5418
  esm_default.spyGlobal();
5419
+ const now = Temporal.Instant.from("2026-05-25T00:00:02Z");
4998
5420
  let dropped = null;
4999
- const { federation, queued } = setup({
5000
- failureThreshold: 1,
5001
- heldActivityTtl: { seconds: 1 },
5002
- onActivityDrop(remoteHost, details) {
5003
- dropped = {
5004
- remoteHost,
5005
- heldSince: details.heldSince
5006
- };
5421
+ const { federation, queued, kv } = setup(false);
5422
+ federation.circuitBreaker = new CircuitBreaker({
5423
+ kv,
5424
+ prefix: ["_fedify", "circuit"],
5425
+ now: () => now,
5426
+ options: {
5427
+ failureThreshold: 1,
5428
+ heldActivityTtl: { seconds: 1 },
5429
+ onActivityDrop(remoteHost, details) {
5430
+ dropped = {
5431
+ remoteHost,
5432
+ heldSince: details.heldSince
5433
+ };
5434
+ }
5007
5435
  }
5008
5436
  });
5009
5437
  let permanentFailureReason;
@@ -2,7 +2,7 @@ const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
4
  require("../chunk-DDcVe30Y.cjs");
5
- const require_middleware = require("../middleware-CRORNnSU.cjs");
5
+ const require_middleware = require("../middleware-DlqW4IRW.cjs");
6
6
  let _logtape_logtape = require("@logtape/logtape");
7
7
  let _fedify_uri_template = require("@fedify/uri-template");
8
8
  let es_toolkit = require("es-toolkit");
@@ -1,6 +1,6 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { $ as CustomCollectionDispatcher, A as FederationKvPrefixes, B as RespondWithObjectOptions, C as IdempotencyKeyCallback, Ct as CircuitBreakerKvState, D as ObjectCallbackSetters, Dt as NormalizedCircuitBreakerOptions, E as InboxListenerSetters, Et as CircuitBreakerStateChange, F as RetryContext, G as ActorHandleMapper, H as respondWithObjectIfAcceptable, I as RetryPolicy, J as CollectionCounter, K as ActorKeyPairsDispatcher, L as createExponentialBackoffPolicy, M as FederationQueueOptions, N as createFederation, O as OutboxListenerSetters, Ot as normalizeCircuitBreakerOptions, P as CreateExponentialBackoffPolicyOptions, Q as CustomCollectionCursor, R as Message, S as FederationStartQueueOptions, St as CircuitBreakerFailurePolicy, T as InboxChallengePolicy, Tt as CircuitBreakerState, U as ActorAliasMapper, V as respondWithObject, W as ActorDispatcher, X as CollectionDispatcher, Y as CollectionCursor, Z as CustomCollectionCounter, _ as Federatable, _t as digest, a as GetSignedKeyOptions, at as OutboxErrorHandler, b as FederationFetchOptions, bt as CircuitBreakerBeforeSendDecision, c as ParseUriResult, ct as OutboxPermanentFailureHandler, d as SendActivityOptions, dt as UnverifiedActivityReason, et as InboxErrorHandler, f as SendActivityOptionsForCollection, ft as WebFingerLinksDispatcher, g as CustomCollectionCallbackSetters, gt as buildCollectionSynchronizationHeader, h as ConstructorWithTypeId, ht as PageItems, i as GetActorOptions, it as ObjectDispatcher, j as FederationOrigin, k as Rfc6570Expression, kt as parseCircuitBreakerKvState, l as RequestContext, lt as SharedInboxKeyDispatcher, m as CollectionCallbackSetters, mt as SenderKeyPair, n as Context, nt as NodeInfoDispatcher, o as InboxContext, ot as OutboxListener, p as ActorCallbackSetters, pt as SendActivityError, q as AuthorizePredicate, r as ForwardActivityOptions, rt as ObjectAuthorizePredicate, s as OutboxContext, st as OutboxListenerErrorHandler, t as ActorKeyPair, tt as InboxListener, u as RouteActivityOptions, ut as UnverifiedActivityHandler, v as Federation, vt as CircuitBreaker, w as IdempotencyStrategy, wt as CircuitBreakerOptions, x as FederationOptions, xt as CircuitBreakerCreateOptions, y as FederationBuilder, yt as CircuitBreakerActivityDrop, z as createFederationBuilder } from "../context-DMHK7jqX.cjs";
2
+ import { $ as CustomCollectionCursor, A as Rfc6570Expression, At as parseCircuitBreakerKvState, B as createFederationBuilder, C as FederationStartQueueOptions, Ct as CircuitBreakerFailurePolicy, D as InboxListenerSetters, Dt as CircuitBreakerStateChange, E as InboxChallengePolicy, Et as CircuitBreakerState, F as CreateExponentialBackoffPolicyOptions, G as ActorDispatcher, H as respondWithObject, I as RetryContext, J as AuthorizePredicate, K as ActorHandleMapper, L as RetryPolicy, M as FederationOrigin, N as FederationQueueOptions, O as ObjectCallbackSetters, Ot as NormalizedCircuitBreakerOptions, P as createFederation, Q as CustomCollectionCounter, R as createExponentialBackoffPolicy, S as FederationOptions, St as CircuitBreakerCreateOptions, T as IdempotencyStrategy, Tt as CircuitBreakerOptions, U as respondWithObjectIfAcceptable, V as RespondWithObjectOptions, W as ActorAliasMapper, X as CollectionCursor, Y as CollectionCounter, Z as CollectionDispatcher, _ as Federatable, _t as buildCollectionSynchronizationHeader, a as GetSignedKeyOptions, at as ObjectDispatcher, b as FederationBuilder, bt as CircuitBreakerActivityDrop, c as ParseUriResult, ct as OutboxListenerErrorHandler, d as SendActivityOptions, dt as UnverifiedActivityHandler, et as CustomCollectionDispatcher, f as SendActivityOptionsForCollection, ft as UnverifiedActivityReason, g as CustomCollectionCallbackSetters, gt as PageItems, h as ConstructorWithTypeId, ht as SenderKeyPair, i as GetActorOptions, it as ObjectAuthorizePredicate, j as FederationKvPrefixes, k as OutboxListenerSetters, kt as normalizeCircuitBreakerOptions, l as RequestContext, lt as OutboxPermanentFailureHandler, m as CollectionCallbackSetters, mt as SendActivityError, n as Context, nt as InboxListener, o as InboxContext, ot as OutboxErrorHandler, p as ActorCallbackSetters, pt as WebFingerLinksDispatcher, q as ActorKeyPairsDispatcher, r as ForwardActivityOptions, rt as NodeInfoDispatcher, s as OutboxContext, st as OutboxListener, t as ActorKeyPair, tt as InboxErrorHandler, u as RouteActivityOptions, ut as SharedInboxKeyDispatcher, v as Federation, vt as digest, w as IdempotencyKeyCallback, wt as CircuitBreakerKvState, x as FederationFetchOptions, xt as CircuitBreakerBeforeSendDecision, y as FederationBenchmarkOptions, yt as CircuitBreaker, z as Message } from "../context-BBVLF7lx.cjs";
3
3
  import { a as MemoryKvStore, i as KvStoreSetOptions, n as KvStore, r as KvStoreListEntry, t as KvKey } from "../kv-gJ8LYbxX.cjs";
4
4
  import { a as MessageQueueEnqueueOptions, i as MessageQueueDepth, n as InProcessMessageQueueOptions, o as MessageQueueListenOptions, r as MessageQueue, s as ParallelMessageQueue, t as InProcessMessageQueue } from "../mq-D8uSFzxe.cjs";
5
- import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-YLnSsEHY.cjs";
6
- export { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CircuitBreaker, CircuitBreakerActivityDrop, CircuitBreakerBeforeSendDecision, CircuitBreakerCreateOptions, CircuitBreakerFailurePolicy, CircuitBreakerKvState, CircuitBreakerOptions, CircuitBreakerState, CircuitBreakerStateChange, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetActorOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxChallengePolicy, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, KvKey, KvStore, KvStoreListEntry, KvStoreSetOptions, MemoryKvStore, Message, MessageQueue, MessageQueueDepth, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, NormalizedCircuitBreakerOptions, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxContext, OutboxErrorHandler, OutboxListener, OutboxListenerErrorHandler, OutboxListenerSetters, OutboxPermanentFailureHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityError, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, UnverifiedActivityHandler, UnverifiedActivityReason, WebFingerHandlerParameters, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, normalizeCircuitBreakerOptions, parseCircuitBreakerKvState, respondWithObject, respondWithObjectIfAcceptable };
5
+ import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-C0F6kvgS.cjs";
6
+ export { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CircuitBreaker, CircuitBreakerActivityDrop, CircuitBreakerBeforeSendDecision, CircuitBreakerCreateOptions, CircuitBreakerFailurePolicy, CircuitBreakerKvState, CircuitBreakerOptions, CircuitBreakerState, CircuitBreakerStateChange, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBenchmarkOptions, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetActorOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxChallengePolicy, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, KvKey, KvStore, KvStoreListEntry, KvStoreSetOptions, MemoryKvStore, Message, MessageQueue, MessageQueueDepth, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, NormalizedCircuitBreakerOptions, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxContext, OutboxErrorHandler, OutboxListener, OutboxListenerErrorHandler, OutboxListenerSetters, OutboxPermanentFailureHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityError, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, UnverifiedActivityHandler, UnverifiedActivityReason, WebFingerHandlerParameters, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, normalizeCircuitBreakerOptions, parseCircuitBreakerKvState, respondWithObject, respondWithObjectIfAcceptable };
@@ -1,6 +1,6 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { $ as CustomCollectionDispatcher, A as FederationKvPrefixes, B as RespondWithObjectOptions, C as IdempotencyKeyCallback, Ct as CircuitBreakerKvState, D as ObjectCallbackSetters, Dt as NormalizedCircuitBreakerOptions, E as InboxListenerSetters, Et as CircuitBreakerStateChange, F as RetryContext, G as ActorHandleMapper, H as respondWithObjectIfAcceptable, I as RetryPolicy, J as CollectionCounter, K as ActorKeyPairsDispatcher, L as createExponentialBackoffPolicy, M as FederationQueueOptions, N as createFederation, O as OutboxListenerSetters, Ot as normalizeCircuitBreakerOptions, P as CreateExponentialBackoffPolicyOptions, Q as CustomCollectionCursor, R as Message, S as FederationStartQueueOptions, St as CircuitBreakerFailurePolicy, T as InboxChallengePolicy, Tt as CircuitBreakerState, U as ActorAliasMapper, V as respondWithObject, W as ActorDispatcher, X as CollectionDispatcher, Y as CollectionCursor, Z as CustomCollectionCounter, _ as Federatable, _t as digest, a as GetSignedKeyOptions, at as OutboxErrorHandler, b as FederationFetchOptions, bt as CircuitBreakerBeforeSendDecision, c as ParseUriResult, ct as OutboxPermanentFailureHandler, d as SendActivityOptions, dt as UnverifiedActivityReason, et as InboxErrorHandler, f as SendActivityOptionsForCollection, ft as WebFingerLinksDispatcher, g as CustomCollectionCallbackSetters, gt as buildCollectionSynchronizationHeader, h as ConstructorWithTypeId, ht as PageItems, i as GetActorOptions, it as ObjectDispatcher, j as FederationOrigin, k as Rfc6570Expression, kt as parseCircuitBreakerKvState, l as RequestContext, lt as SharedInboxKeyDispatcher, m as CollectionCallbackSetters, mt as SenderKeyPair, n as Context, nt as NodeInfoDispatcher, o as InboxContext, ot as OutboxListener, p as ActorCallbackSetters, pt as SendActivityError, q as AuthorizePredicate, r as ForwardActivityOptions, rt as ObjectAuthorizePredicate, s as OutboxContext, st as OutboxListenerErrorHandler, t as ActorKeyPair, tt as InboxListener, u as RouteActivityOptions, ut as UnverifiedActivityHandler, v as Federation, vt as CircuitBreaker, w as IdempotencyStrategy, wt as CircuitBreakerOptions, x as FederationOptions, xt as CircuitBreakerCreateOptions, y as FederationBuilder, yt as CircuitBreakerActivityDrop, z as createFederationBuilder } from "../context-K9cg8oGx.js";
2
+ import { $ as CustomCollectionCursor, A as Rfc6570Expression, At as parseCircuitBreakerKvState, B as createFederationBuilder, C as FederationStartQueueOptions, Ct as CircuitBreakerFailurePolicy, D as InboxListenerSetters, Dt as CircuitBreakerStateChange, E as InboxChallengePolicy, Et as CircuitBreakerState, F as CreateExponentialBackoffPolicyOptions, G as ActorDispatcher, H as respondWithObject, I as RetryContext, J as AuthorizePredicate, K as ActorHandleMapper, L as RetryPolicy, M as FederationOrigin, N as FederationQueueOptions, O as ObjectCallbackSetters, Ot as NormalizedCircuitBreakerOptions, P as createFederation, Q as CustomCollectionCounter, R as createExponentialBackoffPolicy, S as FederationOptions, St as CircuitBreakerCreateOptions, T as IdempotencyStrategy, Tt as CircuitBreakerOptions, U as respondWithObjectIfAcceptable, V as RespondWithObjectOptions, W as ActorAliasMapper, X as CollectionCursor, Y as CollectionCounter, Z as CollectionDispatcher, _ as Federatable, _t as buildCollectionSynchronizationHeader, a as GetSignedKeyOptions, at as ObjectDispatcher, b as FederationBuilder, bt as CircuitBreakerActivityDrop, c as ParseUriResult, ct as OutboxListenerErrorHandler, d as SendActivityOptions, dt as UnverifiedActivityHandler, et as CustomCollectionDispatcher, f as SendActivityOptionsForCollection, ft as UnverifiedActivityReason, g as CustomCollectionCallbackSetters, gt as PageItems, h as ConstructorWithTypeId, ht as SenderKeyPair, i as GetActorOptions, it as ObjectAuthorizePredicate, j as FederationKvPrefixes, k as OutboxListenerSetters, kt as normalizeCircuitBreakerOptions, l as RequestContext, lt as OutboxPermanentFailureHandler, m as CollectionCallbackSetters, mt as SendActivityError, n as Context, nt as InboxListener, o as InboxContext, ot as OutboxErrorHandler, p as ActorCallbackSetters, pt as WebFingerLinksDispatcher, q as ActorKeyPairsDispatcher, r as ForwardActivityOptions, rt as NodeInfoDispatcher, s as OutboxContext, st as OutboxListener, t as ActorKeyPair, tt as InboxErrorHandler, u as RouteActivityOptions, ut as SharedInboxKeyDispatcher, v as Federation, vt as digest, w as IdempotencyKeyCallback, wt as CircuitBreakerKvState, x as FederationFetchOptions, xt as CircuitBreakerBeforeSendDecision, y as FederationBenchmarkOptions, yt as CircuitBreaker, z as Message } from "../context-BU6jSQdo.js";
3
3
  import { a as MemoryKvStore, i as KvStoreSetOptions, n as KvStore, r as KvStoreListEntry, t as KvKey } from "../kv-D6hNiMTK.js";
4
4
  import { a as MessageQueueEnqueueOptions, i as MessageQueueDepth, n as InProcessMessageQueueOptions, o as MessageQueueListenOptions, r as MessageQueue, s as ParallelMessageQueue, t as InProcessMessageQueue } from "../mq-D-nlpY04.js";
5
- import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-CfOFqS0w.js";
6
- export { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CircuitBreaker, CircuitBreakerActivityDrop, CircuitBreakerBeforeSendDecision, CircuitBreakerCreateOptions, CircuitBreakerFailurePolicy, CircuitBreakerKvState, CircuitBreakerOptions, CircuitBreakerState, CircuitBreakerStateChange, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetActorOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxChallengePolicy, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, KvKey, KvStore, KvStoreListEntry, KvStoreSetOptions, MemoryKvStore, Message, MessageQueue, MessageQueueDepth, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, NormalizedCircuitBreakerOptions, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxContext, OutboxErrorHandler, OutboxListener, OutboxListenerErrorHandler, OutboxListenerSetters, OutboxPermanentFailureHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityError, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, UnverifiedActivityHandler, UnverifiedActivityReason, WebFingerHandlerParameters, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, normalizeCircuitBreakerOptions, parseCircuitBreakerKvState, respondWithObject, respondWithObjectIfAcceptable };
5
+ import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-vPYVoa5n.js";
6
+ export { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, CircuitBreaker, CircuitBreakerActivityDrop, CircuitBreakerBeforeSendDecision, CircuitBreakerCreateOptions, CircuitBreakerFailurePolicy, CircuitBreakerKvState, CircuitBreakerOptions, CircuitBreakerState, CircuitBreakerStateChange, CollectionCallbackSetters, CollectionCounter, CollectionCursor, CollectionDispatcher, ConstructorWithTypeId, Context, CreateExponentialBackoffPolicyOptions, CustomCollectionCallbackSetters, CustomCollectionCounter, CustomCollectionCursor, CustomCollectionDispatcher, Federatable, Federation, FederationBenchmarkOptions, FederationBuilder, FederationFetchOptions, FederationKvPrefixes, FederationOptions, FederationOrigin, FederationQueueOptions, FederationStartQueueOptions, ForwardActivityOptions, GetActorOptions, GetSignedKeyOptions, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxChallengePolicy, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, KvKey, KvStore, KvStoreListEntry, KvStoreSetOptions, MemoryKvStore, Message, MessageQueue, MessageQueueDepth, MessageQueueEnqueueOptions, MessageQueueListenOptions, NodeInfoDispatcher, NormalizedCircuitBreakerOptions, ObjectAuthorizePredicate, ObjectCallbackSetters, ObjectDispatcher, OutboxContext, OutboxErrorHandler, OutboxListener, OutboxListenerErrorHandler, OutboxListenerSetters, OutboxPermanentFailureHandler, PageItems, ParallelMessageQueue, ParseUriResult, RequestContext, RespondWithObjectOptions, RetryContext, RetryPolicy, Rfc6570Expression, RouteActivityOptions, Router, RouterError, RouterOptions, RouterRouteResult, SendActivityError, SendActivityOptions, SendActivityOptionsForCollection, SenderKeyPair, SharedInboxKeyDispatcher, UnverifiedActivityHandler, UnverifiedActivityReason, WebFingerHandlerParameters, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, normalizeCircuitBreakerOptions, parseCircuitBreakerKvState, respondWithObject, respondWithObjectIfAcceptable };
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as normalizeCircuitBreakerOptions, f as parseCircuitBreakerKvState, i as SendActivityError, l as digest, o as respondWithObject, p as createFederationBuilder, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as CircuitBreaker } from "../middleware-DrKDd2JT.js";
3
+ import { a as SendActivityError, c as buildCollectionSynchronizationHeader, d as normalizeCircuitBreakerOptions, f as parseCircuitBreakerKvState, i as createExponentialBackoffPolicy, l as digest, o as respondWithObject, p as createFederationBuilder, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as CircuitBreaker } from "../middleware-Dft_sYeS.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
  import { Router as Router$1, RouterError as RouterError$1, assertPath, isPath } from "@fedify/uri-template";
6
6
  import { isEqual } from "es-toolkit";