@fedify/fedify 2.3.0-dev.1110 → 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 (97) hide show
  1. package/dist/{assert_rejects-B-qJtC9Z.mjs → assert_rejects-DQP-q39h.mjs} +27 -2
  2. package/dist/{builder-B-Y6fwSu.mjs → builder-Ond_h57y.mjs} +3 -3
  3. package/dist/compat/mod.d.cts +1 -1
  4. package/dist/compat/mod.d.ts +1 -1
  5. package/dist/compat/outgoing-jsonld.test.mjs +1 -1
  6. package/dist/compat/public-audience.test.mjs +1 -1
  7. package/dist/compat/transformers.test.mjs +2 -2
  8. package/dist/{context-C0C_sRha.d.cts → context-Ch-ZLyTQ.d.cts} +1 -1
  9. package/dist/{context-Dqgt8saU.d.ts → context-cSUMk2da.d.ts} +1 -1
  10. package/dist/{deno-hqC7tKJn.mjs → deno-DVsHS7rA.mjs} +1 -1
  11. package/dist/{docloader-BOEuuXkX.mjs → docloader-WsWfKaE5.mjs} +2 -2
  12. package/dist/federation/builder.test.mjs +3 -3
  13. package/dist/federation/collection.test.mjs +2 -2
  14. package/dist/federation/handler.test.mjs +8 -7
  15. package/dist/federation/idempotency.test.mjs +5 -5
  16. package/dist/federation/inbox.test.mjs +1 -1
  17. package/dist/federation/keycache.test.mjs +1 -1
  18. package/dist/federation/kv.test.mjs +2 -2
  19. package/dist/federation/metrics.test.d.mts +2 -0
  20. package/dist/federation/metrics.test.mjs +107 -0
  21. package/dist/federation/middleware.test.mjs +390 -10
  22. package/dist/federation/mod.cjs +1 -1
  23. package/dist/federation/mod.d.cts +2 -2
  24. package/dist/federation/mod.d.ts +2 -2
  25. package/dist/federation/mod.js +1 -1
  26. package/dist/federation/mq.test.mjs +2 -2
  27. package/dist/federation/negotiation.test.mjs +2 -2
  28. package/dist/federation/router.test.mjs +2 -2
  29. package/dist/federation/send.test.mjs +11 -11
  30. package/dist/federation/webfinger.test.mjs +3 -3
  31. package/dist/{getMachineId-bsd-etIyxDet.mjs → getMachineId-bsd-BY01PL1n.mjs} +1 -1
  32. package/dist/{getMachineId-darwin-D23zTf4g.mjs → getMachineId-darwin-Dr1gkBkp.mjs} +1 -1
  33. package/dist/{getMachineId-win-Dpap6v5i.mjs → getMachineId-win-QEYwcJiy.mjs} +1 -1
  34. package/dist/{http-O8MYWwk8.js → http-CouJSFVK.js} +461 -37
  35. package/dist/{http-DV0il3vk.cjs → http-CubOB9wq.cjs} +513 -35
  36. package/dist/{http-BDZeS5om.d.ts → http-D6LP89UO.d.ts} +7 -1
  37. package/dist/{http-C87EWkO0.d.cts → http-D6aw3j2U.d.cts} +7 -1
  38. package/dist/{http-BLopFpvC.mjs → http-DUV8ysti.mjs} +86 -37
  39. package/dist/{key-DW1EVmtP.mjs → key-BoWaYRHm.mjs} +1 -1
  40. package/dist/{kv-cache-C3NWWiTg.js → kv-cache-DBNpsneh.js} +1 -1
  41. package/dist/{kv-cache-Dya-TWMe.cjs → kv-cache-Dz31ATUT.cjs} +1 -1
  42. package/dist/{ld-BNkk2Yal.mjs → ld-B5K1mSuG.mjs} +60 -9
  43. package/dist/{send-hokVCPu6.mjs → metrics-C4attqv0.mjs} +124 -224
  44. package/dist/{middleware-D6FbOjuK.mjs → middleware-BDKFRjue.mjs} +1 -1
  45. package/dist/{middleware-DUWeXjZR.cjs → middleware-CmsDtIHI.cjs} +75 -309
  46. package/dist/{middleware-CjzI3aYo.js → middleware-Dtjz-hSk.js} +46 -280
  47. package/dist/{middleware-DA2WTBr4.mjs → middleware-t0jC8I99.mjs} +59 -34
  48. package/dist/{mod-DXY9JF28.d.cts → mod-B-Lin9Sy.d.ts} +25 -2
  49. package/dist/{mod-DHO9lk3D.d.ts → mod-BDhgfjP7.d.cts} +25 -2
  50. package/dist/{mod-B0rWmfW5.d.cts → mod-BR_BB0bh.d.cts} +1 -1
  51. package/dist/{mod-Dx3-hqyo.d.ts → mod-C6E8rkcz.d.ts} +1 -1
  52. package/dist/{mod-BhU_H1I_.d.ts → mod-DLrRb0dx.d.ts} +1 -1
  53. package/dist/{mod-CLPnQPsv.d.cts → mod-P9tE2WmM.d.cts} +1 -1
  54. package/dist/mod.cjs +4 -4
  55. package/dist/mod.d.cts +5 -5
  56. package/dist/mod.d.ts +5 -5
  57. package/dist/mod.js +4 -4
  58. package/dist/nodeinfo/client.test.mjs +2 -2
  59. package/dist/nodeinfo/handler.test.mjs +3 -3
  60. package/dist/nodeinfo/types.test.mjs +2 -2
  61. package/dist/otel/exporter.test.mjs +2 -2
  62. package/dist/{outgoing-jsonld-BgFLCJQ_.mjs → outgoing-jsonld-BNL8AC14.mjs} +1 -1
  63. package/dist/{owner-jvJAtR5O.mjs → owner-hDxI0ufu.mjs} +2 -2
  64. package/dist/{proof-BD92WeqV.cjs → proof-BUWfVr6Q.cjs} +78 -11
  65. package/dist/{proof-mfmHH9j0.mjs → proof-DhVuz4bc.mjs} +25 -7
  66. package/dist/{proof-5kT7OUPV.js → proof-n60t8o9P.js} +78 -11
  67. package/dist/send-BPhyR5Oo.mjs +225 -0
  68. package/dist/sig/accept.test.mjs +1 -1
  69. package/dist/sig/http.test.mjs +212 -6
  70. package/dist/sig/key.test.mjs +4 -4
  71. package/dist/sig/ld.test.mjs +138 -5
  72. package/dist/sig/mod.cjs +2 -2
  73. package/dist/sig/mod.d.cts +2 -2
  74. package/dist/sig/mod.d.ts +2 -2
  75. package/dist/sig/mod.js +2 -2
  76. package/dist/sig/owner.test.mjs +4 -4
  77. package/dist/sig/proof.test.mjs +167 -6
  78. package/dist/{std__assert-CRDpx_HF.mjs → std__assert-BTEgfoJo.mjs} +2 -27
  79. package/dist/utils/docloader.test.mjs +5 -5
  80. package/dist/utils/kv-cache.test.mjs +1 -1
  81. package/dist/utils/mod.cjs +1 -1
  82. package/dist/utils/mod.d.cts +1 -1
  83. package/dist/utils/mod.d.ts +1 -1
  84. package/dist/utils/mod.js +1 -1
  85. package/package.json +5 -5
  86. /package/dist/{accept-CceiKpCy.mjs → accept-CgDcxvjV.mjs} +0 -0
  87. /package/dist/{activity-listener-tztVvlNb.mjs → activity-listener-BeTGV3wc.mjs} +0 -0
  88. /package/dist/{client-B_A6mfn3.mjs → client-Bneh_DYR.mjs} +0 -0
  89. /package/dist/{collection-CA3V5zyK.mjs → collection-Cc3DVAhE.mjs} +0 -0
  90. /package/dist/{execAsync-DCBrgFiV.mjs → execAsync-Dxb7rNf3.mjs} +0 -0
  91. /package/dist/{getMachineId-linux-ObI47Hql.mjs → getMachineId-linux-Bbhofx-s.mjs} +0 -0
  92. /package/dist/{getMachineId-unsupported-Ddu-PFeh.mjs → getMachineId-unsupported-dIOte2Ct.mjs} +0 -0
  93. /package/dist/{keys-C3kae-6B.mjs → keys-CSYsOMFG.mjs} +0 -0
  94. /package/dist/{kv-x2IvBUyq.mjs → kv-QHE0oeM3.mjs} +0 -0
  95. /package/dist/{kv-cache-CiiNwT6W.mjs → kv-cache-DihufyAQ.mjs} +0 -0
  96. /package/dist/{public-audience-N3pyOx2p.mjs → public-audience-c9zmYKgA.mjs} +0 -0
  97. /package/dist/{types-BFowWFTT.mjs → types-D09GN0uZ.mjs} +0 -0
@@ -3,22 +3,22 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as RouterError } from "../router-BT_F5748.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
- import { i as assertExists } from "../std__assert-CRDpx_HF.mjs";
7
- import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
6
+ import { r as assertExists } from "../std__assert-BTEgfoJo.mjs";
7
+ import { r as assertFalse, t as assertRejects } from "../assert_rejects-DQP-q39h.mjs";
8
8
  import { t as assertInstanceOf } from "../assert_instance_of-C4Ri6VuN.mjs";
9
9
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
10
10
  import { t as assertNotEquals } from "../assert_not_equals--wG9hV7u.mjs";
11
11
  import { t as assertStrictEquals } from "../assert_strict_equals-Dmjbg-bA.mjs";
12
12
  import { t as assert } from "../assert-DikXweDx.mjs";
13
13
  import { t as esm_default } from "../esm-sdtqOUPu.mjs";
14
- import { l as verifyRequest, s as signRequest } from "../http-BLopFpvC.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-C3kae-6B.mjs";
16
- import { t as getAuthenticatedDocumentLoader } from "../docloader-BOEuuXkX.mjs";
17
- import { a as signJsonLd, o as verifyJsonLd, r as detachSignature } from "../ld-BNkk2Yal.mjs";
18
- import { t as doesActorOwnKey } from "../owner-jvJAtR5O.mjs";
19
- import { i as verifyObject, r as signObject } from "../proof-mfmHH9j0.mjs";
20
- import { t as MemoryKvStore } from "../kv-x2IvBUyq.mjs";
21
- import { i as KvSpecDeterminer, n as FederationImpl, o as createFederation, r as InboxContextImpl, t as ContextImpl } from "../middleware-DA2WTBr4.mjs";
14
+ import { l as verifyRequest, s as signRequest } from "../http-DUV8ysti.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-CSYsOMFG.mjs";
16
+ import { t as getAuthenticatedDocumentLoader } from "../docloader-WsWfKaE5.mjs";
17
+ import { a as signJsonLd, o as verifyJsonLd, r as detachSignature } from "../ld-B5K1mSuG.mjs";
18
+ import { t as doesActorOwnKey } from "../owner-hDxI0ufu.mjs";
19
+ import { i as verifyObject, r as signObject } from "../proof-DhVuz4bc.mjs";
20
+ import { t as MemoryKvStore } from "../kv-QHE0oeM3.mjs";
21
+ import { i as KvSpecDeterminer, n as FederationImpl, o as createFederation, r as InboxContextImpl, t as ContextImpl } from "../middleware-t0jC8I99.mjs";
22
22
  import { configure, reset } from "@logtape/logtape";
23
23
  import * as vocab from "@fedify/vocab";
24
24
  import { getTypeId, lookupObject } from "@fedify/vocab";
@@ -2287,6 +2287,214 @@ test("FederationImpl.processQueuedTask()", async (t) => {
2287
2287
  attempt: 1
2288
2288
  }]);
2289
2289
  });
2290
+ await t.step("records activitypub.outbox.activity retry on transient failure", async () => {
2291
+ const kv = new MemoryKvStore();
2292
+ const [meterProvider, recorder] = createTestMeterProvider();
2293
+ await new FederationImpl({
2294
+ kv,
2295
+ meterProvider,
2296
+ queue: {
2297
+ enqueue(_message, _options) {
2298
+ return Promise.resolve();
2299
+ },
2300
+ listen(_handler, _options) {
2301
+ return Promise.resolve();
2302
+ }
2303
+ }
2304
+ }).processQueuedTask(void 0, {
2305
+ type: "outbox",
2306
+ id: crypto.randomUUID(),
2307
+ baseUrl: "https://example.com",
2308
+ keys: [],
2309
+ activity: {
2310
+ "@context": "https://www.w3.org/ns/activitystreams",
2311
+ type: "Create",
2312
+ actor: "https://example.com/users/alice",
2313
+ object: {
2314
+ type: "Note",
2315
+ content: "test"
2316
+ }
2317
+ },
2318
+ activityType: "https://www.w3.org/ns/activitystreams#Create",
2319
+ inbox: "https://invalid-domain-that-does-not-exist.example/inbox",
2320
+ sharedInbox: false,
2321
+ started: (/* @__PURE__ */ new Date()).toISOString(),
2322
+ attempt: 0,
2323
+ headers: {},
2324
+ traceContext: {}
2325
+ });
2326
+ const outboxLifecycle = recorder.getMeasurements("activitypub.outbox.activity");
2327
+ assertEquals(outboxLifecycle.length, 1);
2328
+ assertEquals(outboxLifecycle[0].type, "counter");
2329
+ assertEquals(outboxLifecycle[0].attributes["activitypub.processing.result"], "retried");
2330
+ assertEquals(outboxLifecycle[0].attributes["activitypub.activity.type"], "https://www.w3.org/ns/activitystreams#Create");
2331
+ });
2332
+ await t.step("records activitypub.outbox.activity abandoned when retry policy gives up", async () => {
2333
+ const kv = new MemoryKvStore();
2334
+ const [meterProvider, recorder] = createTestMeterProvider();
2335
+ await new FederationImpl({
2336
+ kv,
2337
+ meterProvider,
2338
+ queue: {
2339
+ enqueue(_message, _options) {
2340
+ return Promise.resolve();
2341
+ },
2342
+ listen(_handler, _options) {
2343
+ return Promise.resolve();
2344
+ }
2345
+ },
2346
+ outboxRetryPolicy: () => null
2347
+ }).processQueuedTask(void 0, {
2348
+ type: "outbox",
2349
+ id: crypto.randomUUID(),
2350
+ baseUrl: "https://example.com",
2351
+ keys: [],
2352
+ activity: {
2353
+ "@context": "https://www.w3.org/ns/activitystreams",
2354
+ type: "Follow",
2355
+ actor: "https://example.com/users/alice",
2356
+ object: "https://remote.example/users/bob"
2357
+ },
2358
+ activityType: "https://www.w3.org/ns/activitystreams#Follow",
2359
+ inbox: "https://invalid-domain-that-does-not-exist.example/inbox",
2360
+ sharedInbox: false,
2361
+ started: (/* @__PURE__ */ new Date()).toISOString(),
2362
+ attempt: 0,
2363
+ headers: {},
2364
+ traceContext: {}
2365
+ });
2366
+ const outboxLifecycle = recorder.getMeasurements("activitypub.outbox.activity");
2367
+ assertEquals(outboxLifecycle.length, 1);
2368
+ assertEquals(outboxLifecycle[0].type, "counter");
2369
+ assertEquals(outboxLifecycle[0].attributes["activitypub.processing.result"], "abandoned");
2370
+ assertEquals(outboxLifecycle[0].attributes["activitypub.activity.type"], "https://www.w3.org/ns/activitystreams#Follow");
2371
+ });
2372
+ await t.step("records activitypub.inbox.activity processed on successful queued dispatch", async () => {
2373
+ const kv = new MemoryKvStore();
2374
+ const [meterProvider, recorder] = createTestMeterProvider();
2375
+ const federation = new FederationImpl({
2376
+ kv,
2377
+ meterProvider,
2378
+ queue: {
2379
+ enqueue(_message, _options) {
2380
+ return Promise.resolve();
2381
+ },
2382
+ listen(_handler, _options) {
2383
+ return Promise.resolve();
2384
+ }
2385
+ }
2386
+ });
2387
+ federation.setInboxListeners("/users/{identifier}/inbox", "/inbox").on(vocab.Create, () => {});
2388
+ await federation.processQueuedTask(void 0, {
2389
+ type: "inbox",
2390
+ id: crypto.randomUUID(),
2391
+ baseUrl: "https://example.com",
2392
+ activity: {
2393
+ "@context": "https://www.w3.org/ns/activitystreams",
2394
+ type: "Create",
2395
+ id: "https://example.com/activities/queued-processed",
2396
+ actor: "https://remote.example/users/alice",
2397
+ object: {
2398
+ type: "Note",
2399
+ content: "Hello world"
2400
+ }
2401
+ },
2402
+ started: (/* @__PURE__ */ new Date()).toISOString(),
2403
+ attempt: 0,
2404
+ identifier: null,
2405
+ traceContext: {}
2406
+ });
2407
+ const inboxLifecycle = recorder.getMeasurements("activitypub.inbox.activity");
2408
+ assertEquals(inboxLifecycle.length, 1);
2409
+ assertEquals(inboxLifecycle[0].type, "counter");
2410
+ assertEquals(inboxLifecycle[0].attributes["activitypub.processing.result"], "processed");
2411
+ assertEquals(inboxLifecycle[0].attributes["activitypub.activity.type"], "https://www.w3.org/ns/activitystreams#Create");
2412
+ });
2413
+ await t.step("records activitypub.inbox.activity retried on transient listener failure", async () => {
2414
+ const kv = new MemoryKvStore();
2415
+ const [meterProvider, recorder] = createTestMeterProvider();
2416
+ const federation = new FederationImpl({
2417
+ kv,
2418
+ meterProvider,
2419
+ queue: {
2420
+ enqueue(_message, _options) {
2421
+ return Promise.resolve();
2422
+ },
2423
+ listen(_handler, _options) {
2424
+ return Promise.resolve();
2425
+ }
2426
+ }
2427
+ });
2428
+ federation.setInboxListeners("/users/{identifier}/inbox", "/inbox").on(vocab.Create, () => {
2429
+ throw new Error("Intended error for testing");
2430
+ });
2431
+ await federation.processQueuedTask(void 0, {
2432
+ type: "inbox",
2433
+ id: crypto.randomUUID(),
2434
+ baseUrl: "https://example.com",
2435
+ activity: {
2436
+ "@context": "https://www.w3.org/ns/activitystreams",
2437
+ type: "Create",
2438
+ id: "https://example.com/activities/queued-retried",
2439
+ actor: "https://remote.example/users/alice",
2440
+ object: {
2441
+ type: "Note",
2442
+ content: "Hello world"
2443
+ }
2444
+ },
2445
+ started: (/* @__PURE__ */ new Date()).toISOString(),
2446
+ attempt: 0,
2447
+ identifier: null,
2448
+ traceContext: {}
2449
+ });
2450
+ const inboxLifecycle = recorder.getMeasurements("activitypub.inbox.activity");
2451
+ assertEquals(inboxLifecycle.length, 1);
2452
+ assertEquals(inboxLifecycle[0].attributes["activitypub.processing.result"], "retried");
2453
+ assertEquals(inboxLifecycle[0].attributes["activitypub.activity.type"], "https://www.w3.org/ns/activitystreams#Create");
2454
+ });
2455
+ await t.step("records activitypub.inbox.activity abandoned when retry policy gives up", async () => {
2456
+ const kv = new MemoryKvStore();
2457
+ const [meterProvider, recorder] = createTestMeterProvider();
2458
+ const federation = new FederationImpl({
2459
+ kv,
2460
+ meterProvider,
2461
+ queue: {
2462
+ enqueue(_message, _options) {
2463
+ return Promise.resolve();
2464
+ },
2465
+ listen(_handler, _options) {
2466
+ return Promise.resolve();
2467
+ }
2468
+ },
2469
+ inboxRetryPolicy: () => null
2470
+ });
2471
+ federation.setInboxListeners("/users/{identifier}/inbox", "/inbox").on(vocab.Create, () => {
2472
+ throw new Error("Intended error for testing");
2473
+ });
2474
+ await federation.processQueuedTask(void 0, {
2475
+ type: "inbox",
2476
+ id: crypto.randomUUID(),
2477
+ baseUrl: "https://example.com",
2478
+ activity: {
2479
+ "@context": "https://www.w3.org/ns/activitystreams",
2480
+ type: "Create",
2481
+ id: "https://example.com/activities/queued-abandoned",
2482
+ actor: "https://remote.example/users/alice",
2483
+ object: {
2484
+ type: "Note",
2485
+ content: "Hello world"
2486
+ }
2487
+ },
2488
+ started: (/* @__PURE__ */ new Date()).toISOString(),
2489
+ attempt: 0,
2490
+ identifier: null,
2491
+ traceContext: {}
2492
+ });
2493
+ const inboxLifecycle = recorder.getMeasurements("activitypub.inbox.activity");
2494
+ assertEquals(inboxLifecycle.length, 1);
2495
+ assertEquals(inboxLifecycle[0].attributes["activitypub.processing.result"], "abandoned");
2496
+ assertEquals(inboxLifecycle[0].attributes["activitypub.activity.type"], "https://www.w3.org/ns/activitystreams#Create");
2497
+ });
2290
2498
  await t.step("records queued inbox processing duration", async () => {
2291
2499
  const kv = new MemoryKvStore();
2292
2500
  const [meterProvider, recorder] = createTestMeterProvider();
@@ -2447,6 +2655,10 @@ test("FederationImpl.processQueuedTask() permanent failure", async (t) => {
2447
2655
  assertEquals(failures[0].value, 1);
2448
2656
  assertEquals(failures[0].attributes["activitypub.remote.host"], "gone.example");
2449
2657
  assertEquals(failures[0].attributes["http.response.status_code"], 410);
2658
+ const abandoned = recorder.getMeasurements("activitypub.outbox.activity");
2659
+ assertEquals(abandoned.length, 1);
2660
+ assertEquals(abandoned[0].attributes["activitypub.processing.result"], "abandoned");
2661
+ assertEquals(abandoned[0].attributes["activitypub.activity.type"], "https://www.w3.org/ns/activitystreams#Create");
2450
2662
  const events = exporter.getEvents("activitypub.outbox", "activitypub.delivery.failed");
2451
2663
  assertEquals(events.length, 1);
2452
2664
  assertEquals(events[0].attributes?.["activitypub.remote.host"], "gone.example");
@@ -3414,6 +3626,66 @@ test("ContextImpl.sendActivity()", async (t) => {
3414
3626
  });
3415
3627
  esm_default.hardReset();
3416
3628
  });
3629
+ test("ContextImpl.sendActivity() records fanout recipient metrics", async () => {
3630
+ const kv = new MemoryKvStore();
3631
+ const [meterProvider, recorder] = createTestMeterProvider();
3632
+ const queue = {
3633
+ messages: [],
3634
+ enqueue(message) {
3635
+ this.messages.push(message);
3636
+ return Promise.resolve();
3637
+ },
3638
+ async listen() {}
3639
+ };
3640
+ const federation = new FederationImpl({
3641
+ kv,
3642
+ contextLoaderFactory: () => mockDocumentLoader,
3643
+ queue,
3644
+ meterProvider
3645
+ });
3646
+ federation.setActorDispatcher("/{identifier}", async (ctx, identifier) => {
3647
+ if (identifier !== "john") return null;
3648
+ const keys = await ctx.getActorKeyPairs(identifier);
3649
+ return new vocab.Person({
3650
+ id: ctx.getActorUri(identifier),
3651
+ preferredUsername: "john",
3652
+ publicKey: keys[0].cryptographicKey,
3653
+ assertionMethods: keys.map((k) => k.multikey)
3654
+ });
3655
+ }).setKeyPairsDispatcher((_ctx, identifier) => {
3656
+ if (identifier !== "john") return [];
3657
+ return [{
3658
+ privateKey: rsaPrivateKey2,
3659
+ publicKey: rsaPublicKey2.publicKey
3660
+ }, {
3661
+ privateKey: ed25519PrivateKey,
3662
+ publicKey: ed25519PublicKey.publicKey
3663
+ }];
3664
+ });
3665
+ const ctx = new ContextImpl({
3666
+ data: void 0,
3667
+ federation,
3668
+ url: new URL("https://example.com/"),
3669
+ documentLoader: mockDocumentLoader,
3670
+ contextLoader: mockDocumentLoader
3671
+ });
3672
+ const activity = new vocab.Create({
3673
+ id: new URL("https://example.com/activity/1"),
3674
+ actor: new URL("https://example.com/person")
3675
+ });
3676
+ const recipients = Array.from({ length: 7 }, (_, i) => ({
3677
+ id: new URL(`https://example${i + 1}.com/recipient`),
3678
+ inboxId: new URL(`https://example${i + 1}.com/inbox`)
3679
+ }));
3680
+ await ctx.sendActivity({ username: "john" }, recipients, activity, { fanout: "force" });
3681
+ assertEquals(queue.messages.length, 1);
3682
+ assertEquals(queue.messages[0].type, "fanout");
3683
+ const measurements = recorder.getMeasurements("activitypub.fanout.recipients");
3684
+ assertEquals(measurements.length, 1);
3685
+ assertEquals(measurements[0].type, "histogram");
3686
+ assertEquals(measurements[0].value, recipients.length);
3687
+ assertEquals(measurements[0].attributes["activitypub.activity.type"], "https://www.w3.org/ns/activitystreams#Create");
3688
+ });
3417
3689
  test({
3418
3690
  name: "ContextImpl.routeActivity()",
3419
3691
  permissions: {
@@ -3525,6 +3797,114 @@ test({
3525
3797
  assertEquals(enqueuedMetrics[0].attributes["fedify.queue.task.attempt"], 0);
3526
3798
  }
3527
3799
  });
3800
+ test({
3801
+ name: "ContextImpl.routeActivity() records inbox.activity lifecycle metrics",
3802
+ permissions: {
3803
+ env: true,
3804
+ read: true
3805
+ },
3806
+ async fn() {
3807
+ const [meterProvider, recorder] = createTestMeterProvider();
3808
+ const federation = new FederationImpl({
3809
+ kv: new MemoryKvStore(),
3810
+ meterProvider,
3811
+ queue: {
3812
+ enqueue() {
3813
+ return Promise.resolve();
3814
+ },
3815
+ listen() {
3816
+ return Promise.resolve();
3817
+ }
3818
+ }
3819
+ });
3820
+ federation.setInboxListeners("/u/{identifier}/i", "/i");
3821
+ const ctx = new ContextImpl({
3822
+ url: new URL("https://example.com/"),
3823
+ federation,
3824
+ data: void 0,
3825
+ documentLoader: mockDocumentLoader,
3826
+ contextLoader: documentLoader
3827
+ });
3828
+ const signedOffer = await signObject(new vocab.Offer({
3829
+ id: new URL("https://example.com/offer-queued"),
3830
+ actor: new URL("https://example.com/person2")
3831
+ }), ed25519PrivateKey, ed25519Multikey.id);
3832
+ assert(await ctx.routeActivity(null, signedOffer));
3833
+ const queued = recorder.getMeasurements("activitypub.inbox.activity");
3834
+ assertEquals(queued.length, 1);
3835
+ assertEquals(queued[0].type, "counter");
3836
+ assertEquals(queued[0].attributes["activitypub.processing.result"], "queued");
3837
+ assertEquals(queued[0].attributes["activitypub.activity.type"], "https://www.w3.org/ns/activitystreams#Offer");
3838
+ }
3839
+ });
3840
+ test({
3841
+ name: "ContextImpl.routeActivity() records inbox.activity processed without queue",
3842
+ permissions: {
3843
+ env: true,
3844
+ read: true
3845
+ },
3846
+ async fn() {
3847
+ const [meterProvider, recorder] = createTestMeterProvider();
3848
+ const federation = new FederationImpl({
3849
+ kv: new MemoryKvStore(),
3850
+ meterProvider
3851
+ });
3852
+ federation.setInboxListeners("/u/{identifier}/i", "/i").on(vocab.Offer, () => {});
3853
+ const ctx = new ContextImpl({
3854
+ url: new URL("https://example.com/"),
3855
+ federation,
3856
+ data: void 0,
3857
+ documentLoader: mockDocumentLoader,
3858
+ contextLoader: documentLoader
3859
+ });
3860
+ const signedOffer = await signObject(new vocab.Offer({
3861
+ id: new URL("https://example.com/offer-processed"),
3862
+ actor: new URL("https://example.com/person2")
3863
+ }), ed25519PrivateKey, ed25519Multikey.id);
3864
+ assert(await ctx.routeActivity(null, signedOffer));
3865
+ const processed = recorder.getMeasurements("activitypub.inbox.activity");
3866
+ assertEquals(processed.length, 1);
3867
+ assertEquals(processed[0].attributes["activitypub.processing.result"], "processed");
3868
+ assertEquals(processed[0].attributes["activitypub.activity.type"], "https://www.w3.org/ns/activitystreams#Offer");
3869
+ }
3870
+ });
3871
+ test({
3872
+ name: "ContextImpl.routeActivity() records inbox.activity rejected for unsupported type and duplicates",
3873
+ permissions: {
3874
+ env: true,
3875
+ read: true
3876
+ },
3877
+ async fn() {
3878
+ const [meterProvider, recorder] = createTestMeterProvider();
3879
+ const federation = new FederationImpl({
3880
+ kv: new MemoryKvStore(),
3881
+ meterProvider
3882
+ });
3883
+ federation.setInboxListeners("/u/{identifier}/i", "/i").on(vocab.Offer, () => {});
3884
+ const ctx = new ContextImpl({
3885
+ url: new URL("https://example.com/"),
3886
+ federation,
3887
+ data: void 0,
3888
+ documentLoader: mockDocumentLoader,
3889
+ contextLoader: documentLoader
3890
+ });
3891
+ const signedCreate = await signObject(new vocab.Create({
3892
+ id: new URL("https://example.com/create-unsupported"),
3893
+ actor: new URL("https://example.com/person2")
3894
+ }), ed25519PrivateKey, ed25519Multikey.id);
3895
+ assert(await ctx.routeActivity(null, signedCreate));
3896
+ const dupOffer = await signObject(new vocab.Offer({
3897
+ id: new URL("https://example.com/offer-duplicate"),
3898
+ actor: new URL("https://example.com/person2")
3899
+ }), ed25519PrivateKey, ed25519Multikey.id);
3900
+ assert(await ctx.routeActivity(null, dupOffer));
3901
+ assert(await ctx.routeActivity(null, dupOffer));
3902
+ const rejected = recorder.getMeasurements("activitypub.inbox.activity").filter((m) => m.attributes["activitypub.processing.result"] === "rejected");
3903
+ assertEquals(rejected.length, 2);
3904
+ assertEquals(rejected[0].attributes["activitypub.activity.type"], "https://www.w3.org/ns/activitystreams#Create");
3905
+ assertEquals(rejected[1].attributes["activitypub.activity.type"], "https://www.w3.org/ns/activitystreams#Offer");
3906
+ }
3907
+ });
3528
3908
  test("ContextImpl.getCollectionUri()", () => {
3529
3909
  const federation = new FederationImpl({ kv: new MemoryKvStore() });
3530
3910
  const base = "https://example.com";
@@ -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-DUWeXjZR.cjs");
5
+ const require_middleware = require("../middleware-CmsDtIHI.cjs");
6
6
  let es_toolkit = require("es-toolkit");
7
7
  //#region src/federation/kv.ts
8
8
  /**
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { $ as ParallelMessageQueue, A as FederationKvPrefixes, B as Router, C as IdempotencyKeyCallback, Ct as WebFingerLinksDispatcher, D as ObjectCallbackSetters, Dt as buildCollectionSynchronizationHeader, E as InboxListenerSetters, Et as PageItems, F as RetryContext, G as respondWithObject, H as RouterOptions, I as RetryPolicy, J as InProcessMessageQueueOptions, K as respondWithObjectIfAcceptable, L as createExponentialBackoffPolicy, M as FederationQueueOptions, N as createFederation, O as OutboxListenerSetters, Ot as digest, P as CreateExponentialBackoffPolicyOptions, Q as MessageQueueListenOptions, R as Message, S as FederationStartQueueOptions, St as UnverifiedActivityReason, T as InboxChallengePolicy, Tt as SenderKeyPair, U as RouterRouteResult, V as RouterError, W as RespondWithObjectOptions, X as MessageQueueDepth, Y as MessageQueue, Z as MessageQueueEnqueueOptions, _ as Federatable, _t as OutboxListener, a as GetSignedKeyOptions, at as CollectionCounter, b as FederationFetchOptions, bt as SharedInboxKeyDispatcher, c as ParseUriResult, ct as CustomCollectionCounter, d as SendActivityOptions, dt as InboxErrorHandler, et as ActorAliasMapper, f as SendActivityOptionsForCollection, ft as InboxListener, g as CustomCollectionCallbackSetters, gt as OutboxErrorHandler, h as ConstructorWithTypeId, ht as ObjectDispatcher, i as GetActorOptions, it as AuthorizePredicate, j as FederationOrigin, k as Rfc6570Expression, l as RequestContext, lt as CustomCollectionCursor, m as CollectionCallbackSetters, mt as ObjectAuthorizePredicate, n as Context, nt as ActorHandleMapper, o as InboxContext, ot as CollectionCursor, p as ActorCallbackSetters, pt as NodeInfoDispatcher, q as InProcessMessageQueue, r as ForwardActivityOptions, rt as ActorKeyPairsDispatcher, s as OutboxContext, st as CollectionDispatcher, t as ActorKeyPair, tt as ActorDispatcher, u as RouteActivityOptions, ut as CustomCollectionDispatcher, v as Federation, vt as OutboxListenerErrorHandler, w as IdempotencyStrategy, wt as SendActivityError, x as FederationOptions, xt as UnverifiedActivityHandler, y as FederationBuilder, yt as OutboxPermanentFailureHandler, z as createFederationBuilder } from "../context-C0C_sRha.cjs";
2
+ import { $ as ParallelMessageQueue, A as FederationKvPrefixes, B as Router, C as IdempotencyKeyCallback, Ct as WebFingerLinksDispatcher, D as ObjectCallbackSetters, Dt as buildCollectionSynchronizationHeader, E as InboxListenerSetters, Et as PageItems, F as RetryContext, G as respondWithObject, H as RouterOptions, I as RetryPolicy, J as InProcessMessageQueueOptions, K as respondWithObjectIfAcceptable, L as createExponentialBackoffPolicy, M as FederationQueueOptions, N as createFederation, O as OutboxListenerSetters, Ot as digest, P as CreateExponentialBackoffPolicyOptions, Q as MessageQueueListenOptions, R as Message, S as FederationStartQueueOptions, St as UnverifiedActivityReason, T as InboxChallengePolicy, Tt as SenderKeyPair, U as RouterRouteResult, V as RouterError, W as RespondWithObjectOptions, X as MessageQueueDepth, Y as MessageQueue, Z as MessageQueueEnqueueOptions, _ as Federatable, _t as OutboxListener, a as GetSignedKeyOptions, at as CollectionCounter, b as FederationFetchOptions, bt as SharedInboxKeyDispatcher, c as ParseUriResult, ct as CustomCollectionCounter, d as SendActivityOptions, dt as InboxErrorHandler, et as ActorAliasMapper, f as SendActivityOptionsForCollection, ft as InboxListener, g as CustomCollectionCallbackSetters, gt as OutboxErrorHandler, h as ConstructorWithTypeId, ht as ObjectDispatcher, i as GetActorOptions, it as AuthorizePredicate, j as FederationOrigin, k as Rfc6570Expression, l as RequestContext, lt as CustomCollectionCursor, m as CollectionCallbackSetters, mt as ObjectAuthorizePredicate, n as Context, nt as ActorHandleMapper, o as InboxContext, ot as CollectionCursor, p as ActorCallbackSetters, pt as NodeInfoDispatcher, q as InProcessMessageQueue, r as ForwardActivityOptions, rt as ActorKeyPairsDispatcher, s as OutboxContext, st as CollectionDispatcher, t as ActorKeyPair, tt as ActorDispatcher, u as RouteActivityOptions, ut as CustomCollectionDispatcher, v as Federation, vt as OutboxListenerErrorHandler, w as IdempotencyStrategy, wt as SendActivityError, x as FederationOptions, xt as UnverifiedActivityHandler, y as FederationBuilder, yt as OutboxPermanentFailureHandler, z as createFederationBuilder } from "../context-Ch-ZLyTQ.cjs";
3
3
  import { a as MemoryKvStore, i as KvStoreSetOptions, n as KvStore, r as KvStoreListEntry, t as KvKey } from "../kv-gJ8LYbxX.cjs";
4
- import { n as handleWebFinger, t as WebFingerHandlerParameters } from "../mod-CLPnQPsv.cjs";
4
+ import { n as handleWebFinger, t as WebFingerHandlerParameters } from "../mod-P9tE2WmM.cjs";
5
5
  export { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, 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, 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, respondWithObject, respondWithObjectIfAcceptable };
@@ -1,5 +1,5 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { $ as ParallelMessageQueue, A as FederationKvPrefixes, B as Router, C as IdempotencyKeyCallback, Ct as WebFingerLinksDispatcher, D as ObjectCallbackSetters, Dt as buildCollectionSynchronizationHeader, E as InboxListenerSetters, Et as PageItems, F as RetryContext, G as respondWithObject, H as RouterOptions, I as RetryPolicy, J as InProcessMessageQueueOptions, K as respondWithObjectIfAcceptable, L as createExponentialBackoffPolicy, M as FederationQueueOptions, N as createFederation, O as OutboxListenerSetters, Ot as digest, P as CreateExponentialBackoffPolicyOptions, Q as MessageQueueListenOptions, R as Message, S as FederationStartQueueOptions, St as UnverifiedActivityReason, T as InboxChallengePolicy, Tt as SenderKeyPair, U as RouterRouteResult, V as RouterError, W as RespondWithObjectOptions, X as MessageQueueDepth, Y as MessageQueue, Z as MessageQueueEnqueueOptions, _ as Federatable, _t as OutboxListener, a as GetSignedKeyOptions, at as CollectionCounter, b as FederationFetchOptions, bt as SharedInboxKeyDispatcher, c as ParseUriResult, ct as CustomCollectionCounter, d as SendActivityOptions, dt as InboxErrorHandler, et as ActorAliasMapper, f as SendActivityOptionsForCollection, ft as InboxListener, g as CustomCollectionCallbackSetters, gt as OutboxErrorHandler, h as ConstructorWithTypeId, ht as ObjectDispatcher, i as GetActorOptions, it as AuthorizePredicate, j as FederationOrigin, k as Rfc6570Expression, l as RequestContext, lt as CustomCollectionCursor, m as CollectionCallbackSetters, mt as ObjectAuthorizePredicate, n as Context, nt as ActorHandleMapper, o as InboxContext, ot as CollectionCursor, p as ActorCallbackSetters, pt as NodeInfoDispatcher, q as InProcessMessageQueue, r as ForwardActivityOptions, rt as ActorKeyPairsDispatcher, s as OutboxContext, st as CollectionDispatcher, t as ActorKeyPair, tt as ActorDispatcher, u as RouteActivityOptions, ut as CustomCollectionDispatcher, v as Federation, vt as OutboxListenerErrorHandler, w as IdempotencyStrategy, wt as SendActivityError, x as FederationOptions, xt as UnverifiedActivityHandler, y as FederationBuilder, yt as OutboxPermanentFailureHandler, z as createFederationBuilder } from "../context-Dqgt8saU.js";
2
+ import { $ as ParallelMessageQueue, A as FederationKvPrefixes, B as Router, C as IdempotencyKeyCallback, Ct as WebFingerLinksDispatcher, D as ObjectCallbackSetters, Dt as buildCollectionSynchronizationHeader, E as InboxListenerSetters, Et as PageItems, F as RetryContext, G as respondWithObject, H as RouterOptions, I as RetryPolicy, J as InProcessMessageQueueOptions, K as respondWithObjectIfAcceptable, L as createExponentialBackoffPolicy, M as FederationQueueOptions, N as createFederation, O as OutboxListenerSetters, Ot as digest, P as CreateExponentialBackoffPolicyOptions, Q as MessageQueueListenOptions, R as Message, S as FederationStartQueueOptions, St as UnverifiedActivityReason, T as InboxChallengePolicy, Tt as SenderKeyPair, U as RouterRouteResult, V as RouterError, W as RespondWithObjectOptions, X as MessageQueueDepth, Y as MessageQueue, Z as MessageQueueEnqueueOptions, _ as Federatable, _t as OutboxListener, a as GetSignedKeyOptions, at as CollectionCounter, b as FederationFetchOptions, bt as SharedInboxKeyDispatcher, c as ParseUriResult, ct as CustomCollectionCounter, d as SendActivityOptions, dt as InboxErrorHandler, et as ActorAliasMapper, f as SendActivityOptionsForCollection, ft as InboxListener, g as CustomCollectionCallbackSetters, gt as OutboxErrorHandler, h as ConstructorWithTypeId, ht as ObjectDispatcher, i as GetActorOptions, it as AuthorizePredicate, j as FederationOrigin, k as Rfc6570Expression, l as RequestContext, lt as CustomCollectionCursor, m as CollectionCallbackSetters, mt as ObjectAuthorizePredicate, n as Context, nt as ActorHandleMapper, o as InboxContext, ot as CollectionCursor, p as ActorCallbackSetters, pt as NodeInfoDispatcher, q as InProcessMessageQueue, r as ForwardActivityOptions, rt as ActorKeyPairsDispatcher, s as OutboxContext, st as CollectionDispatcher, t as ActorKeyPair, tt as ActorDispatcher, u as RouteActivityOptions, ut as CustomCollectionDispatcher, v as Federation, vt as OutboxListenerErrorHandler, w as IdempotencyStrategy, wt as SendActivityError, x as FederationOptions, xt as UnverifiedActivityHandler, y as FederationBuilder, yt as OutboxPermanentFailureHandler, z as createFederationBuilder } from "../context-cSUMk2da.js";
3
3
  import { a as MemoryKvStore, i as KvStoreSetOptions, n as KvStore, r as KvStoreListEntry, t as KvKey } from "../kv-D6hNiMTK.js";
4
- import { n as handleWebFinger, t as WebFingerHandlerParameters } from "../mod-Dx3-hqyo.js";
4
+ import { n as handleWebFinger, t as WebFingerHandlerParameters } from "../mod-C6E8rkcz.js";
5
5
  export { ActorAliasMapper, ActorCallbackSetters, ActorDispatcher, ActorHandleMapper, ActorKeyPair, ActorKeyPairsDispatcher, AuthorizePredicate, 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, 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, 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 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-CjzI3aYo.js";
3
+ 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";
4
4
  import { isEqual } from "es-toolkit";
5
5
  //#region src/federation/kv.ts
6
6
  /**
@@ -2,8 +2,8 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
- import { n as assertGreater, r as assertGreaterOrEqual } from "../std__assert-CRDpx_HF.mjs";
6
- import { n as assertFalse } from "../assert_rejects-B-qJtC9Z.mjs";
5
+ import { n as assertGreater } from "../std__assert-BTEgfoJo.mjs";
6
+ import { n as assertGreaterOrEqual, r as assertFalse } from "../assert_rejects-DQP-q39h.mjs";
7
7
  import { t as assert } from "../assert-DikXweDx.mjs";
8
8
  import { delay } from "es-toolkit";
9
9
  import { test } from "@fedify/fixture";
@@ -1,8 +1,8 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import "../std__assert-CRDpx_HF.mjs";
5
- import { n as assertFalse } from "../assert_rejects-B-qJtC9Z.mjs";
4
+ import "../std__assert-BTEgfoJo.mjs";
5
+ import { r as assertFalse } from "../assert_rejects-DQP-q39h.mjs";
6
6
  import { t as assert } from "../assert-DikXweDx.mjs";
7
7
  import { t as acceptsJsonLd } from "../negotiation-DDstyBvc.mjs";
8
8
  import { test } from "@fedify/fixture";
@@ -3,8 +3,8 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as RouterError, t as Router } from "../router-BT_F5748.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
- import "../std__assert-CRDpx_HF.mjs";
7
- import { n as assertFalse } from "../assert_rejects-B-qJtC9Z.mjs";
6
+ import "../std__assert-BTEgfoJo.mjs";
7
+ import { r as assertFalse } from "../assert_rejects-DQP-q39h.mjs";
8
8
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
9
9
  import { t as assert } from "../assert-DikXweDx.mjs";
10
10
  import { test } from "@fedify/fixture";
@@ -3,16 +3,16 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as __require, r as __toESM, t as __commonJSMin } from "../chunk-DNRtMIoB.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
- import { r as assertGreaterOrEqual } from "../std__assert-CRDpx_HF.mjs";
7
- import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
6
+ import "../std__assert-BTEgfoJo.mjs";
7
+ import { n as assertGreaterOrEqual, r as assertFalse, t as assertRejects } from "../assert_rejects-DQP-q39h.mjs";
8
8
  import { t as assertInstanceOf } from "../assert_instance_of-C4Ri6VuN.mjs";
9
9
  import { t as assertNotEquals } from "../assert_not_equals--wG9hV7u.mjs";
10
10
  import { t as assert } from "../assert-DikXweDx.mjs";
11
11
  import { t as esm_default } from "../esm-sdtqOUPu.mjs";
12
- import { l as verifyRequest } from "../http-BLopFpvC.mjs";
13
- import { i as rsaPrivateKey2, n as ed25519PrivateKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-C3kae-6B.mjs";
14
- import { t as doesActorOwnKey } from "../owner-jvJAtR5O.mjs";
15
- import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "../send-hokVCPu6.mjs";
12
+ import { l as verifyRequest } from "../http-DUV8ysti.mjs";
13
+ import { i as rsaPrivateKey2, n as ed25519PrivateKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CSYsOMFG.mjs";
14
+ import { t as doesActorOwnKey } from "../owner-hDxI0ufu.mjs";
15
+ import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "../send-BPhyR5Oo.mjs";
16
16
  import { Activity, Application, Endpoints, Group, Person, Service } from "@fedify/vocab";
17
17
  import { createTestMeterProvider, createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
18
18
  //#region ../../node_modules/.pnpm/@opentelemetry+sdk-metrics@2.7.1_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/sdk-metrics/build/src/export/AggregationTemporality.js
@@ -2525,19 +2525,19 @@ var require_getMachineId = /* @__PURE__ */ __commonJSMin(((exports) => {
2525
2525
  async function getMachineId() {
2526
2526
  if (!getMachineIdImpl) switch (process$1.platform) {
2527
2527
  case "darwin":
2528
- getMachineIdImpl = (await import("../getMachineId-darwin-D23zTf4g.mjs").then((m) => /* @__PURE__ */ __toESM(m.default))).getMachineId;
2528
+ getMachineIdImpl = (await import("../getMachineId-darwin-Dr1gkBkp.mjs").then((m) => /* @__PURE__ */ __toESM(m.default))).getMachineId;
2529
2529
  break;
2530
2530
  case "linux":
2531
- getMachineIdImpl = (await import("../getMachineId-linux-ObI47Hql.mjs").then((m) => /* @__PURE__ */ __toESM(m.default))).getMachineId;
2531
+ getMachineIdImpl = (await import("../getMachineId-linux-Bbhofx-s.mjs").then((m) => /* @__PURE__ */ __toESM(m.default))).getMachineId;
2532
2532
  break;
2533
2533
  case "freebsd":
2534
- getMachineIdImpl = (await import("../getMachineId-bsd-etIyxDet.mjs").then((m) => /* @__PURE__ */ __toESM(m.default))).getMachineId;
2534
+ getMachineIdImpl = (await import("../getMachineId-bsd-BY01PL1n.mjs").then((m) => /* @__PURE__ */ __toESM(m.default))).getMachineId;
2535
2535
  break;
2536
2536
  case "win32":
2537
- getMachineIdImpl = (await import("../getMachineId-win-Dpap6v5i.mjs").then((m) => /* @__PURE__ */ __toESM(m.default))).getMachineId;
2537
+ getMachineIdImpl = (await import("../getMachineId-win-QEYwcJiy.mjs").then((m) => /* @__PURE__ */ __toESM(m.default))).getMachineId;
2538
2538
  break;
2539
2539
  default:
2540
- getMachineIdImpl = (await import("../getMachineId-unsupported-Ddu-PFeh.mjs").then((m) => /* @__PURE__ */ __toESM(m.default))).getMachineId;
2540
+ getMachineIdImpl = (await import("../getMachineId-unsupported-dIOte2Ct.mjs").then((m) => /* @__PURE__ */ __toESM(m.default))).getMachineId;
2541
2541
  break;
2542
2542
  }
2543
2543
  return getMachineIdImpl();
@@ -3,9 +3,9 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { r as createRequestContext } from "../context-BAE7AKLA.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
- import "../std__assert-CRDpx_HF.mjs";
7
- import { t as MemoryKvStore } from "../kv-x2IvBUyq.mjs";
8
- import { o as createFederation, s as handleWebFinger } from "../middleware-DA2WTBr4.mjs";
6
+ import "../std__assert-BTEgfoJo.mjs";
7
+ import { t as MemoryKvStore } from "../kv-QHE0oeM3.mjs";
8
+ import { o as createFederation, s as handleWebFinger } from "../middleware-t0jC8I99.mjs";
9
9
  import { Image, Link, Person, Tombstone } from "@fedify/vocab";
10
10
  import { test } from "@fedify/fixture";
11
11
  //#region src/federation/webfinger.test.ts
@@ -2,7 +2,7 @@ import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as __require, t as __commonJSMin } from "./chunk-DNRtMIoB.mjs";
5
- import { t as require_execAsync } from "./execAsync-DCBrgFiV.mjs";
5
+ import { t as require_execAsync } from "./execAsync-Dxb7rNf3.mjs";
6
6
  //#region ../../node_modules/.pnpm/@opentelemetry+resources@2.7.1_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/machine-id/getMachineId-bsd.js
7
7
  var require_getMachineId_bsd = /* @__PURE__ */ __commonJSMin(((exports) => {
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -2,7 +2,7 @@ import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as __require, t as __commonJSMin } from "./chunk-DNRtMIoB.mjs";
5
- import { t as require_execAsync } from "./execAsync-DCBrgFiV.mjs";
5
+ import { t as require_execAsync } from "./execAsync-Dxb7rNf3.mjs";
6
6
  //#region ../../node_modules/.pnpm/@opentelemetry+resources@2.7.1_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/machine-id/getMachineId-darwin.js
7
7
  var require_getMachineId_darwin = /* @__PURE__ */ __commonJSMin(((exports) => {
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -2,7 +2,7 @@ import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as __require, t as __commonJSMin } from "./chunk-DNRtMIoB.mjs";
5
- import { t as require_execAsync } from "./execAsync-DCBrgFiV.mjs";
5
+ import { t as require_execAsync } from "./execAsync-Dxb7rNf3.mjs";
6
6
  //#region ../../node_modules/.pnpm/@opentelemetry+resources@2.7.1_@opentelemetry+api@1.9.1/node_modules/@opentelemetry/resources/build/src/detectors/platform/node/machine-id/getMachineId-win.js
7
7
  var require_getMachineId_win = /* @__PURE__ */ __commonJSMin(((exports) => {
8
8
  Object.defineProperty(exports, "__esModule", { value: true });