@fedify/fedify 2.4.0-dev.1583 → 2.4.0-dev.1618

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 (158) hide show
  1. package/dist/{accept-CgDcxvjV.mjs → accept-8PiolDP7.mjs} +1 -1
  2. package/dist/{activity-listener-BeTGV3wc.mjs → activity-listener-BtTSxZWA.mjs} +1 -1
  3. package/dist/{assert-DvVHoIZ0.mjs → assert-CJ1KXcvv.mjs} +2 -2
  4. package/dist/{assert_equals-PBVKNMJd.mjs → assert_equals-BV7oLMxm.mjs} +1 -1
  5. package/dist/{assert_instance_of-CxoC8bVq.mjs → assert_instance_of-Q9KTBnrf.mjs} +2 -2
  6. package/dist/{assert_not_equals-C8vcTTA3.mjs → assert_not_equals-EPJPoxuf.mjs} +2 -2
  7. package/dist/{assert_rejects-DAdaaIWM.mjs → assert_rejects-EgstcQy5.mjs} +3 -3
  8. package/dist/{assert_strict_equals-BzqyKuYL.mjs → assert_strict_equals-Ec20AUwa.mjs} +2 -2
  9. package/dist/{assert_throws-zN79lgIC.mjs → assert_throws-NiFfqbnH.mjs} +2 -2
  10. package/dist/{builder-Doj1FmsW.mjs → builder-C4a7TAvq.mjs} +26 -4
  11. package/dist/{chunk-DDcVe30Y.cjs → chunk-Czpeue4M.cjs} +0 -1
  12. package/dist/{chunk-CRNNMoPX.js → chunk-D5IdezsZ.js} +1 -1
  13. package/dist/{circuit-breaker-hJBB6jwA.mjs → circuit-breaker-CBGyz5F7.mjs} +1 -1
  14. package/dist/{client-B_A6mfn3.mjs → client-CjF5IYQS.mjs} +1 -1
  15. package/dist/{codec-nfBU4Up4.mjs → codec-BBga-FWI.mjs} +1 -1
  16. package/dist/{collection-Dp5ky45w.mjs → collection-BIhlldqK.mjs} +1 -1
  17. package/dist/compat/mod.cjs +1 -2
  18. package/dist/compat/mod.d.cts +1 -1
  19. package/dist/compat/mod.d.ts +1 -1
  20. package/dist/compat/mod.js +2 -2
  21. package/dist/compat/outgoing-jsonld.test.d.mts +1 -1
  22. package/dist/compat/outgoing-jsonld.test.mjs +4 -4
  23. package/dist/compat/public-audience.test.d.mts +1 -1
  24. package/dist/compat/public-audience.test.mjs +4 -4
  25. package/dist/compat/transformers.test.d.mts +1 -1
  26. package/dist/compat/transformers.test.mjs +6 -6
  27. package/dist/{context-BBRTgkrs.mjs → context-BJXxPElm.mjs} +3 -2
  28. package/dist/{context-GfQA-CqB.d.ts → context-Zii1f5xS.d.ts} +97 -1
  29. package/dist/{context-BLe0NPtZ.d.cts → context-lxX6I7as.d.cts} +97 -1
  30. package/dist/{deno-Bkl9jNVs.mjs → deno-DepnPEgI.mjs} +2 -2
  31. package/dist/{docloader-f1XFaWWh.mjs → docloader-C_IefWRb.mjs} +3 -3
  32. package/dist/{esm-vrlUxr60.mjs → esm-yYQfPhIY.mjs} +1 -1
  33. package/dist/federation/builder.test.d.mts +1 -1
  34. package/dist/federation/builder.test.mjs +16 -6
  35. package/dist/federation/circuit-breaker.test.d.mts +1 -1
  36. package/dist/federation/circuit-breaker.test.mjs +6 -6
  37. package/dist/federation/collection.test.d.mts +1 -1
  38. package/dist/federation/collection.test.mjs +4 -4
  39. package/dist/federation/handler.test.d.mts +1 -1
  40. package/dist/federation/handler.test.mjs +14 -14
  41. package/dist/federation/idempotency.test.d.mts +1 -1
  42. package/dist/federation/idempotency.test.mjs +7 -7
  43. package/dist/federation/inbox.test.d.mts +1 -1
  44. package/dist/federation/inbox.test.mjs +4 -4
  45. package/dist/federation/keycache.test.d.mts +1 -1
  46. package/dist/federation/keycache.test.mjs +6 -6
  47. package/dist/federation/kv.test.d.mts +1 -1
  48. package/dist/federation/kv.test.mjs +4 -4
  49. package/dist/federation/metrics.test.d.mts +1 -1
  50. package/dist/federation/metrics.test.mjs +5 -5
  51. package/dist/federation/middleware.test.d.mts +1 -1
  52. package/dist/federation/middleware.test.mjs +470 -22
  53. package/dist/federation/mod.cjs +4 -3
  54. package/dist/federation/mod.d.cts +3 -3
  55. package/dist/federation/mod.d.ts +3 -3
  56. package/dist/federation/mod.js +2 -2
  57. package/dist/federation/mq.test.d.mts +1 -1
  58. package/dist/federation/mq.test.mjs +6 -6
  59. package/dist/federation/negotiation.test.d.mts +1 -1
  60. package/dist/federation/negotiation.test.mjs +5 -5
  61. package/dist/federation/retry.test.d.mts +1 -1
  62. package/dist/federation/retry.test.mjs +4 -4
  63. package/dist/federation/router.test.d.mts +1 -1
  64. package/dist/federation/router.test.mjs +6 -6
  65. package/dist/federation/send.test.d.mts +1 -1
  66. package/dist/federation/send.test.mjs +12 -12
  67. package/dist/federation/tasks/codec.test.d.mts +1 -1
  68. package/dist/federation/tasks/codec.test.mjs +2 -2
  69. package/dist/federation/tasks/enqueue.test.d.mts +1 -1
  70. package/dist/federation/tasks/enqueue.test.mjs +5 -5
  71. package/dist/federation/tasks/tasks.test.d.mts +1 -1
  72. package/dist/federation/tasks/tasks.test.mjs +7 -7
  73. package/dist/federation/temporal.test.d.mts +1 -1
  74. package/dist/federation/temporal.test.mjs +5 -5
  75. package/dist/federation/webfinger.test.d.mts +1 -1
  76. package/dist/federation/webfinger.test.mjs +7 -7
  77. package/dist/{http-BBkdx4Kd.mjs → http-CT7tcVBN.mjs} +5 -5
  78. package/dist/{http-jCq51U37.cjs → http-D5ylizT7.cjs} +4 -3
  79. package/dist/{http-CphHLbTC.js → http-DD07Erm7.js} +2 -2
  80. package/dist/{key-BBKNHoB9.mjs → key-C3t-PS3M.mjs} +3 -3
  81. package/dist/{keycache-CaOR6NYg.mjs → keycache-_DHqz5z_.mjs} +1 -1
  82. package/dist/{keys-CSYsOMFG.mjs → keys-Dbyd7bhl.mjs} +1 -1
  83. package/dist/{kv-CIvR3Non.mjs → kv-CXBAok3k.mjs} +1 -1
  84. package/dist/{kv-cache-D3KdEZAg.js → kv-cache-Bvv7Wp8h.js} +2 -2
  85. package/dist/{kv-cache-SVUAUYIs.mjs → kv-cache-CK273Baz.mjs} +2 -2
  86. package/dist/{kv-cache-B9Zvq4xB.cjs → kv-cache-DbFdquuM.cjs} +4 -3
  87. package/dist/{ld-DLyXLPDS.mjs → ld-D8wAPjxC.mjs} +4 -4
  88. package/dist/{metrics-BVRrGEXj.mjs → metrics-D1NrDWq-.mjs} +2 -2
  89. package/dist/{middleware-1AyOpRqz.mjs → middleware-BRunoF2v.mjs} +244 -24
  90. package/dist/{middleware-CzWfDAQY.mjs → middleware-CaP0k3AD.mjs} +2 -2
  91. package/dist/{middleware-B1jZw4xB.js → middleware-kQ-qwTDh.js} +249 -7
  92. package/dist/{middleware-DszmUorL.cjs → middleware-nmfhGFtV.cjs} +290 -39
  93. package/dist/{mod-Cmr39iWq.d.ts → mod-DLc2Ot6f.d.ts} +1 -1
  94. package/dist/{mod-B8Efb9qp.d.cts → mod-gOlPDuT8.d.cts} +1 -1
  95. package/dist/mod.cjs +7 -8
  96. package/dist/mod.d.cts +4 -4
  97. package/dist/mod.d.ts +4 -4
  98. package/dist/mod.js +8 -8
  99. package/dist/{mq-03vS-C9P.mjs → mq-llHKivST.mjs} +1 -1
  100. package/dist/{negotiation-m_L2nyS3.mjs → negotiation-RuwrPFqi.mjs} +1 -1
  101. package/dist/nodeinfo/client.test.d.mts +1 -1
  102. package/dist/nodeinfo/client.test.mjs +5 -5
  103. package/dist/nodeinfo/handler.test.d.mts +1 -1
  104. package/dist/nodeinfo/handler.test.mjs +6 -6
  105. package/dist/nodeinfo/mod.cjs +1 -2
  106. package/dist/nodeinfo/mod.js +2 -2
  107. package/dist/nodeinfo/types.test.d.mts +1 -1
  108. package/dist/nodeinfo/types.test.mjs +5 -5
  109. package/dist/otel/exporter.test.d.mts +1 -1
  110. package/dist/otel/exporter.test.mjs +4 -4
  111. package/dist/otel/mod.cjs +1 -2
  112. package/dist/otel/mod.js +1 -1
  113. package/dist/{outgoing-jsonld-BNL8AC14.mjs → outgoing-jsonld-URuqsICz.mjs} +2 -2
  114. package/dist/{owner-BukzQW4T.mjs → owner-BjdNNmKF.mjs} +3 -3
  115. package/dist/{proof-IDHRILpm.js → proof--HiDnLAE.js} +15 -4
  116. package/dist/{proof-BVglyYRW.mjs → proof-1Xy5Ur-T.mjs} +19 -7
  117. package/dist/{proof-DkeR_Fsm.cjs → proof-DcOiiLDF.cjs} +16 -4
  118. package/dist/{public-audience-c9zmYKgA.mjs → public-audience-Cr5MsnMq.mjs} +1 -1
  119. package/dist/{retry-DI4O-zYl.mjs → retry-DgFqeS5k.mjs} +1 -1
  120. package/dist/runtime/mod.cjs +1 -2
  121. package/dist/runtime/mod.js +2 -2
  122. package/dist/{send-D04Hz77b.mjs → send-ClJ4UcZL.mjs} +4 -4
  123. package/dist/sig/accept.test.d.mts +1 -1
  124. package/dist/sig/accept.test.mjs +2 -2
  125. package/dist/sig/http.test.d.mts +1 -1
  126. package/dist/sig/http.test.mjs +10 -10
  127. package/dist/sig/key.test.d.mts +1 -1
  128. package/dist/sig/key.test.mjs +7 -7
  129. package/dist/sig/ld.test.d.mts +1 -1
  130. package/dist/sig/ld.test.mjs +8 -8
  131. package/dist/sig/mod.cjs +2 -3
  132. package/dist/sig/mod.js +3 -3
  133. package/dist/sig/owner.test.d.mts +1 -1
  134. package/dist/sig/owner.test.mjs +7 -7
  135. package/dist/sig/proof.test.d.mts +1 -1
  136. package/dist/sig/proof.test.mjs +146 -9
  137. package/dist/{std__assert-Dh6uLf_q.mjs → std__assert-B2NnY9bq.mjs} +5 -5
  138. package/dist/temporal-polyfill-BCdTHexd.cjs +3565 -0
  139. package/dist/{temporal-xcPM9mxe.mjs → temporal-wA-b1IAz.mjs} +2 -2
  140. package/dist/testing/mod.d.mts +97 -1
  141. package/dist/testing/mod.mjs +3 -3
  142. package/dist/{testing-Dy-WhqpN.mjs → testing-CO7ftO8A.mjs} +3 -3
  143. package/dist/{transformers-NeAONrAq.cjs → transformers-DGwl-hD1.cjs} +1 -2
  144. package/dist/{transformers-BGMIq1cs.js → transformers-DXze6FUB.js} +1 -1
  145. package/dist/{types-KC4QAoxe.cjs → types-CPym83zc.cjs} +1 -2
  146. package/dist/{types-BFowWFTT.mjs → types-CrtdVuDP.mjs} +1 -1
  147. package/dist/{types-CAY3OdLq.js → types-DC1pNgJA.js} +1 -1
  148. package/dist/utils/docloader.test.d.mts +1 -1
  149. package/dist/utils/docloader.test.mjs +8 -8
  150. package/dist/utils/kv-cache.test.d.mts +1 -1
  151. package/dist/utils/kv-cache.test.mjs +2 -2
  152. package/dist/utils/mod.cjs +1 -2
  153. package/dist/utils/mod.js +2 -2
  154. package/dist/vocab/cjs.test.d.mts +1 -1
  155. package/dist/vocab/cjs.test.mjs +14 -1
  156. package/dist/vocab/mod.cjs +0 -1
  157. package/dist/vocab/mod.js +1 -1
  158. package/package.json +8 -8
@@ -1,27 +1,27 @@
1
- import { Temporal } from "@js-temporal/polyfill";
1
+ import { Temporal } from "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { t as esm_default } from "../esm-vrlUxr60.mjs";
5
- import { t as MemoryKvStore } from "../kv-CIvR3Non.mjs";
6
- import { a as numberSchema, r as envelopeSchema, t as MockQueue } from "../testing-Dy-WhqpN.mjs";
7
- import { t as assertEquals } from "../assert_equals-PBVKNMJd.mjs";
8
- import { r as assertExists } from "../std__assert-Dh6uLf_q.mjs";
9
- import { r as assertFalse, t as assertRejects } from "../assert_rejects-DAdaaIWM.mjs";
10
- import { t as assertInstanceOf } from "../assert_instance_of-CxoC8bVq.mjs";
11
- import { t as assertThrows } from "../assert_throws-zN79lgIC.mjs";
12
- import { t as assertNotEquals } from "../assert_not_equals-C8vcTTA3.mjs";
13
- import { t as assertStrictEquals } from "../assert_strict_equals-BzqyKuYL.mjs";
14
- import { t as assert } from "../assert-DvVHoIZ0.mjs";
15
- import { g as recordInboxActivity } from "../metrics-BVRrGEXj.mjs";
16
- import { l as verifyRequest, s as signRequest } from "../http-BBkdx4Kd.mjs";
17
- 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";
18
- import { t as getAuthenticatedDocumentLoader } from "../docloader-f1XFaWWh.mjs";
19
- import { a as compactJsonLd, h as verifyJsonLd, p as signJsonLd, s as detachSignature } from "../ld-DLyXLPDS.mjs";
20
- import { t as doesActorOwnKey } from "../owner-BukzQW4T.mjs";
21
- import { i as verifyObject, r as signObject } from "../proof-BVglyYRW.mjs";
22
- import { g as handleBenchmarkTrigger, i as KvSpecDeterminer, n as FederationImpl, o as createFederation, r as InboxContextImpl, t as ContextImpl } from "../middleware-1AyOpRqz.mjs";
23
- import { t as CircuitBreaker } from "../circuit-breaker-hJBB6jwA.mjs";
24
- import { t as TaskCodec } from "../codec-nfBU4Up4.mjs";
4
+ import { t as esm_default } from "../esm-yYQfPhIY.mjs";
5
+ import { t as MemoryKvStore } from "../kv-CXBAok3k.mjs";
6
+ import { a as numberSchema, r as envelopeSchema, t as MockQueue } from "../testing-CO7ftO8A.mjs";
7
+ import { t as assertEquals } from "../assert_equals-BV7oLMxm.mjs";
8
+ import { r as assertExists } from "../std__assert-B2NnY9bq.mjs";
9
+ import { r as assertFalse, t as assertRejects } from "../assert_rejects-EgstcQy5.mjs";
10
+ import { t as assertInstanceOf } from "../assert_instance_of-Q9KTBnrf.mjs";
11
+ import { t as assertThrows } from "../assert_throws-NiFfqbnH.mjs";
12
+ import { t as assertNotEquals } from "../assert_not_equals-EPJPoxuf.mjs";
13
+ import { t as assertStrictEquals } from "../assert_strict_equals-Ec20AUwa.mjs";
14
+ import { t as assert } from "../assert-CJ1KXcvv.mjs";
15
+ import { g as recordInboxActivity } from "../metrics-D1NrDWq-.mjs";
16
+ import { l as verifyRequest, s as signRequest } from "../http-CT7tcVBN.mjs";
17
+ import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-Dbyd7bhl.mjs";
18
+ import { t as getAuthenticatedDocumentLoader } from "../docloader-C_IefWRb.mjs";
19
+ import { a as compactJsonLd, h as verifyJsonLd, p as signJsonLd, s as detachSignature } from "../ld-D8wAPjxC.mjs";
20
+ import { t as doesActorOwnKey } from "../owner-BjdNNmKF.mjs";
21
+ import { i as verifyObject, r as signObject } from "../proof-1Xy5Ur-T.mjs";
22
+ import { g as handleBenchmarkTrigger, i as KvSpecDeterminer, n as FederationImpl, o as createFederation, r as InboxContextImpl, t as ContextImpl } from "../middleware-BRunoF2v.mjs";
23
+ import { t as CircuitBreaker } from "../circuit-breaker-CBGyz5F7.mjs";
24
+ import { t as TaskCodec } from "../codec-BBga-FWI.mjs";
25
25
  import { configure, reset } from "@logtape/logtape";
26
26
  import { RouterError } from "@fedify/uri-template";
27
27
  import * as vocab from "@fedify/vocab";
@@ -2417,6 +2417,454 @@ test("Federation.setOutboxListeners()", async (t) => {
2417
2417
  assertEquals(enqueuedMetrics[0].attributes["fedify.queue.task.attempt"], 0);
2418
2418
  });
2419
2419
  });
2420
+ function makeUploadForm(options = {}) {
2421
+ const { file = true, object = JSON.stringify({
2422
+ "@context": "https://www.w3.org/ns/activitystreams",
2423
+ type: "Image",
2424
+ name: "A cat"
2425
+ }) } = options;
2426
+ const form = new FormData();
2427
+ if (file) form.append("file", new File([new Uint8Array([
2428
+ 1,
2429
+ 2,
2430
+ 3
2431
+ ])], "cat.png", { type: "image/png" }));
2432
+ if (object != null) form.append("object", new Blob([object], { type: "application/json" }));
2433
+ return form;
2434
+ }
2435
+ test("Federation.setMediaUploader()", async (t) => {
2436
+ const kv = new MemoryKvStore();
2437
+ await t.step("path validation", () => {
2438
+ const federation = createFederation({
2439
+ kv,
2440
+ documentLoaderFactory: () => mockDocumentLoader
2441
+ });
2442
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/")));
2443
+ assertThrows(() => federation.setMediaUploader("/users/{identifier}/media2", () => Promise.resolve(new URL("https://example.com/"))), RouterError);
2444
+ });
2445
+ await t.step("getMediaUploaderUri() builds the endpoint URI", () => {
2446
+ const federation = createFederation({
2447
+ kv,
2448
+ documentLoaderFactory: () => mockDocumentLoader
2449
+ });
2450
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/")));
2451
+ assertEquals(federation.createContext(new URL("https://example.com/"), void 0).getMediaUploaderUri("alice").href, "https://example.com/users/alice/media");
2452
+ });
2453
+ await t.step("returns 201 Created when the callback returns an object", async () => {
2454
+ const federation = createFederation({
2455
+ kv,
2456
+ documentLoaderFactory: () => mockDocumentLoader
2457
+ });
2458
+ federation.setActorDispatcher("/users/{identifier}", (_ctx, identifier) => identifier === "john" ? new vocab.Person({}) : null);
2459
+ federation.setObjectDispatcher(vocab.Image, "/objects/{uuid}", (_ctx, values) => new vocab.Image({ name: `Image ${values.uuid}` }));
2460
+ let receivedFileType;
2461
+ let receivedName;
2462
+ federation.setMediaUploader("/users/{identifier}/media", (ctx, _identifier, file, object) => {
2463
+ receivedFileType = file.type;
2464
+ receivedName = typeof object.name === "string" ? object.name : object.name?.toString();
2465
+ return Promise.resolve(new vocab.Image({
2466
+ id: ctx.getObjectUri(vocab.Image, { uuid: "abc" }),
2467
+ url: new URL("https://example.com/files/abc.png"),
2468
+ mediaType: file.type,
2469
+ name: object.name
2470
+ }));
2471
+ }).authorize((_ctx, identifier) => identifier === "john");
2472
+ const response = await federation.fetch(new Request("https://example.com/users/john/media", {
2473
+ method: "POST",
2474
+ body: makeUploadForm()
2475
+ }), { contextData: void 0 });
2476
+ assertEquals(response.status, 201);
2477
+ assertEquals(response.headers.get("location"), "https://example.com/objects/abc");
2478
+ assertEquals(receivedFileType, "image/png");
2479
+ assertEquals(receivedName, "A cat");
2480
+ assertEquals((await response.json()).id, "https://example.com/objects/abc");
2481
+ });
2482
+ await t.step("returns 202 Accepted when the callback returns a URL", async () => {
2483
+ const federation = createFederation({
2484
+ kv,
2485
+ documentLoaderFactory: () => mockDocumentLoader
2486
+ });
2487
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Person({}));
2488
+ federation.setObjectDispatcher(vocab.Video, "/videos/{uuid}", (_ctx, values) => new vocab.Video({ name: `Video ${values.uuid}` }));
2489
+ federation.setMediaUploader("/users/{identifier}/media", (ctx) => Promise.resolve(ctx.getObjectUri(vocab.Video, { uuid: "xyz" }))).authorize(() => true);
2490
+ const response = await federation.fetch(new Request("https://example.com/users/john/media", {
2491
+ method: "POST",
2492
+ body: makeUploadForm()
2493
+ }), { contextData: void 0 });
2494
+ assertEquals(response.status, 202);
2495
+ assertEquals(response.headers.get("location"), "https://example.com/videos/xyz");
2496
+ assertEquals(await response.text(), "");
2497
+ });
2498
+ await t.step("accepts the object field as a plain text part", async () => {
2499
+ const federation = createFederation({
2500
+ kv,
2501
+ documentLoaderFactory: () => mockDocumentLoader
2502
+ });
2503
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Person({}));
2504
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/pending")));
2505
+ const form = new FormData();
2506
+ form.append("file", new File([new Uint8Array([
2507
+ 1,
2508
+ 2,
2509
+ 3
2510
+ ])], "cat.png", { type: "image/png" }));
2511
+ form.append("object", JSON.stringify({
2512
+ "@context": "https://www.w3.org/ns/activitystreams",
2513
+ type: "Image",
2514
+ name: "A cat"
2515
+ }));
2516
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john/media", {
2517
+ method: "POST",
2518
+ body: form
2519
+ }), { contextData: void 0 })).status, 202);
2520
+ });
2521
+ await t.step("415 when the request is not multipart/form-data", async () => {
2522
+ const federation = createFederation({
2523
+ kv,
2524
+ documentLoaderFactory: () => mockDocumentLoader
2525
+ });
2526
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/")));
2527
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john/media", {
2528
+ method: "POST",
2529
+ body: JSON.stringify({ type: "Image" }),
2530
+ headers: { "content-type": "application/json" }
2531
+ }), { contextData: void 0 })).status, 415);
2532
+ });
2533
+ await t.step("500 when the returned object has no id (no Location possible)", async () => {
2534
+ const federation = createFederation({
2535
+ kv,
2536
+ documentLoaderFactory: () => mockDocumentLoader
2537
+ });
2538
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Person({}));
2539
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new vocab.Image({ name: "no id" })));
2540
+ const response = await federation.fetch(new Request("https://example.com/users/john/media", {
2541
+ method: "POST",
2542
+ body: makeUploadForm()
2543
+ }), { contextData: void 0 });
2544
+ assertEquals(response.status, 500);
2545
+ assertEquals(response.headers.get("location"), null);
2546
+ });
2547
+ await t.step("500 when the callback returns null (defensive)", async () => {
2548
+ const federation = createFederation({
2549
+ kv,
2550
+ documentLoaderFactory: () => mockDocumentLoader
2551
+ });
2552
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Person({}));
2553
+ federation.setMediaUploader("/users/{identifier}/media", (() => Promise.resolve(null)));
2554
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john/media", {
2555
+ method: "POST",
2556
+ body: makeUploadForm()
2557
+ }), { contextData: void 0 })).status, 500);
2558
+ });
2559
+ await t.step("500 when serializing the returned object throws", async () => {
2560
+ const federation = createFederation({
2561
+ kv,
2562
+ documentLoaderFactory: () => mockDocumentLoader
2563
+ });
2564
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Person({}));
2565
+ federation.setMediaUploader("/users/{identifier}/media", () => {
2566
+ const image = new vocab.Image({ id: new URL("https://example.com/objects/x") });
2567
+ image.toJsonLd = () => Promise.reject(/* @__PURE__ */ new Error("serialization boom"));
2568
+ return Promise.resolve(image);
2569
+ });
2570
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john/media", {
2571
+ method: "POST",
2572
+ body: makeUploadForm()
2573
+ }), { contextData: void 0 })).status, 500);
2574
+ });
2575
+ await t.step("400 when the file field is missing", async () => {
2576
+ const federation = createFederation({
2577
+ kv,
2578
+ documentLoaderFactory: () => mockDocumentLoader
2579
+ });
2580
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Person({}));
2581
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/")));
2582
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john/media", {
2583
+ method: "POST",
2584
+ body: makeUploadForm({ file: false })
2585
+ }), { contextData: void 0 })).status, 400);
2586
+ });
2587
+ await t.step("400 when the object field is missing", async () => {
2588
+ const federation = createFederation({
2589
+ kv,
2590
+ documentLoaderFactory: () => mockDocumentLoader
2591
+ });
2592
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Person({}));
2593
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/")));
2594
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john/media", {
2595
+ method: "POST",
2596
+ body: makeUploadForm({ object: null })
2597
+ }), { contextData: void 0 })).status, 400);
2598
+ });
2599
+ await t.step("400 when the object field is unparseable", async () => {
2600
+ const federation = createFederation({
2601
+ kv,
2602
+ documentLoaderFactory: () => mockDocumentLoader
2603
+ });
2604
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Person({}));
2605
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/")));
2606
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john/media", {
2607
+ method: "POST",
2608
+ body: makeUploadForm({ object: "{ not json" })
2609
+ }), { contextData: void 0 })).status, 400);
2610
+ });
2611
+ await t.step("401 when authorize returns false", async () => {
2612
+ const federation = createFederation({
2613
+ kv,
2614
+ documentLoaderFactory: () => mockDocumentLoader
2615
+ });
2616
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Person({}));
2617
+ let called = false;
2618
+ federation.setMediaUploader("/users/{identifier}/media", () => {
2619
+ called = true;
2620
+ return Promise.resolve(new URL("https://example.com/"));
2621
+ }).authorize(() => false);
2622
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john/media", {
2623
+ method: "POST",
2624
+ body: makeUploadForm()
2625
+ }), { contextData: void 0 })).status, 401);
2626
+ assertEquals(called, false);
2627
+ });
2628
+ await t.step("authorize hook can read request headers", async () => {
2629
+ const federation = createFederation({
2630
+ kv,
2631
+ documentLoaderFactory: () => mockDocumentLoader
2632
+ });
2633
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Person({}));
2634
+ let seenAuthorization = null;
2635
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/pending"))).authorize((ctx) => {
2636
+ seenAuthorization = ctx.request.headers.get("authorization");
2637
+ return seenAuthorization === "Bearer ok";
2638
+ });
2639
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john/media", {
2640
+ method: "POST",
2641
+ headers: { authorization: "Bearer ok" },
2642
+ body: makeUploadForm()
2643
+ }), { contextData: void 0 })).status, 202);
2644
+ assertEquals(seenAuthorization, "Bearer ok");
2645
+ });
2646
+ await t.step("authorize hook can read the request body, and the upload still succeeds", async () => {
2647
+ const federation = createFederation({
2648
+ kv,
2649
+ documentLoaderFactory: () => mockDocumentLoader
2650
+ });
2651
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Person({}));
2652
+ let authorizeBodyLength = -1;
2653
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/pending"))).authorize(async (ctx) => {
2654
+ authorizeBodyLength = (await ctx.request.arrayBuffer()).byteLength;
2655
+ return authorizeBodyLength > 0;
2656
+ });
2657
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john/media", {
2658
+ method: "POST",
2659
+ body: makeUploadForm()
2660
+ }), { contextData: void 0 })).status, 202);
2661
+ assert(authorizeBodyLength > 0);
2662
+ });
2663
+ await t.step("404 when the actor does not exist (callback not invoked)", async () => {
2664
+ const federation = createFederation({
2665
+ kv,
2666
+ documentLoaderFactory: () => mockDocumentLoader
2667
+ });
2668
+ federation.setActorDispatcher("/users/{identifier}", (_ctx, identifier) => identifier === "john" ? new vocab.Person({}) : null);
2669
+ let called = false;
2670
+ federation.setMediaUploader("/users/{identifier}/media", () => {
2671
+ called = true;
2672
+ return Promise.resolve(new URL("https://example.com/"));
2673
+ });
2674
+ assertEquals((await federation.fetch(new Request("https://example.com/users/no-one/media", {
2675
+ method: "POST",
2676
+ body: makeUploadForm()
2677
+ }), { contextData: void 0 })).status, 404);
2678
+ assertEquals(called, false);
2679
+ });
2680
+ await t.step("404 for a missing actor takes precedence over authorization", async () => {
2681
+ const federation = createFederation({
2682
+ kv,
2683
+ documentLoaderFactory: () => mockDocumentLoader
2684
+ });
2685
+ federation.setActorDispatcher("/users/{identifier}", (_ctx, identifier) => identifier === "john" ? new vocab.Person({}) : null);
2686
+ let authorizeCalled = false;
2687
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/"))).authorize(() => {
2688
+ authorizeCalled = true;
2689
+ return false;
2690
+ });
2691
+ assertEquals((await federation.fetch(new Request("https://example.com/users/no-one/media", {
2692
+ method: "POST",
2693
+ body: makeUploadForm()
2694
+ }), { contextData: void 0 })).status, 404);
2695
+ assertEquals(authorizeCalled, false);
2696
+ });
2697
+ await t.step("400 when the body errors during the authorization read", async () => {
2698
+ const federation = createFederation({
2699
+ kv,
2700
+ documentLoaderFactory: () => mockDocumentLoader
2701
+ });
2702
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Person({}));
2703
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/"))).authorize(() => true);
2704
+ const erroringBody = new ReadableStream({ pull(controller) {
2705
+ controller.error(/* @__PURE__ */ new Error("stream boom"));
2706
+ } });
2707
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john/media", {
2708
+ method: "POST",
2709
+ headers: { "content-type": "multipart/form-data; boundary=abc" },
2710
+ body: erroringBody,
2711
+ duplex: "half"
2712
+ }), { contextData: void 0 })).status, 400);
2713
+ });
2714
+ await t.step("404 when the actor is tombstoned (callback not invoked)", async () => {
2715
+ const federation = createFederation({
2716
+ kv,
2717
+ documentLoaderFactory: () => mockDocumentLoader
2718
+ });
2719
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Tombstone({}));
2720
+ let called = false;
2721
+ federation.setMediaUploader("/users/{identifier}/media", () => {
2722
+ called = true;
2723
+ return Promise.resolve(new URL("https://example.com/"));
2724
+ });
2725
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john/media", {
2726
+ method: "POST",
2727
+ body: makeUploadForm()
2728
+ }), { contextData: void 0 })).status, 404);
2729
+ assertEquals(called, false);
2730
+ });
2731
+ await t.step("405 for non-POST methods", async () => {
2732
+ const federation = createFederation({
2733
+ kv,
2734
+ documentLoaderFactory: () => mockDocumentLoader
2735
+ });
2736
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/")));
2737
+ const response = await federation.fetch(new Request("https://example.com/users/john/media", {
2738
+ method: "GET",
2739
+ headers: { accept: "application/activity+json" }
2740
+ }), { contextData: void 0 });
2741
+ assertEquals(response.status, 405);
2742
+ assertEquals(response.headers.get("allow"), "POST");
2743
+ });
2744
+ await t.step("warns when the returned id is not a registered object route", async () => {
2745
+ await withLogtapeLock(async () => {
2746
+ const records = [];
2747
+ await reset();
2748
+ try {
2749
+ await configure({
2750
+ sinks: { buffer(record) {
2751
+ records.push(record);
2752
+ } },
2753
+ filters: {},
2754
+ loggers: [{
2755
+ category: [],
2756
+ sinks: ["buffer"]
2757
+ }]
2758
+ });
2759
+ const federation = createFederation({
2760
+ kv,
2761
+ documentLoaderFactory: () => mockDocumentLoader
2762
+ });
2763
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Person({}));
2764
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new vocab.Image({ id: new URL("https://example.com/not-registered") })));
2765
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john/media", {
2766
+ method: "POST",
2767
+ body: makeUploadForm()
2768
+ }), { contextData: void 0 })).status, 201);
2769
+ assertEquals(records.some((record) => record.category.join(".") === "fedify.federation.mediaUploader" && record.level === "warning" && record.properties.identifier === "john"), true);
2770
+ } finally {
2771
+ await reset();
2772
+ }
2773
+ });
2774
+ });
2775
+ await t.step("warns when the actor omits endpoints.uploadMedia", async () => {
2776
+ await withLogtapeLock(async () => {
2777
+ const records = [];
2778
+ await reset();
2779
+ try {
2780
+ await configure({
2781
+ sinks: { buffer(record) {
2782
+ records.push(record);
2783
+ } },
2784
+ filters: {},
2785
+ loggers: [{
2786
+ category: [],
2787
+ sinks: ["buffer"]
2788
+ }]
2789
+ });
2790
+ const federation = createFederation({
2791
+ kv,
2792
+ documentLoaderFactory: () => mockDocumentLoader
2793
+ });
2794
+ federation.setActorDispatcher("/users/{identifier}", (ctx, identifier) => new vocab.Person({ id: ctx.getActorUri(identifier) }));
2795
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/")));
2796
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john", { headers: { accept: "application/activity+json" } }), { contextData: void 0 })).status, 200);
2797
+ assertEquals(records.some((record) => record.rawMessage === "You configured a media uploader, but the actor does not have a endpoints.uploadMedia property. Set the property with Context.getMediaUploaderUri(identifier)."), true);
2798
+ } finally {
2799
+ await reset();
2800
+ }
2801
+ });
2802
+ });
2803
+ await t.step("does not warn when the actor advertises endpoints.uploadMedia", async () => {
2804
+ await withLogtapeLock(async () => {
2805
+ const records = [];
2806
+ await reset();
2807
+ try {
2808
+ await configure({
2809
+ sinks: { buffer(record) {
2810
+ records.push(record);
2811
+ } },
2812
+ filters: {},
2813
+ loggers: [{
2814
+ category: [],
2815
+ sinks: ["buffer"]
2816
+ }]
2817
+ });
2818
+ const federation = createFederation({
2819
+ kv,
2820
+ documentLoaderFactory: () => mockDocumentLoader
2821
+ });
2822
+ federation.setActorDispatcher("/users/{identifier}", (ctx, identifier) => new vocab.Person({
2823
+ id: ctx.getActorUri(identifier),
2824
+ endpoints: new vocab.Endpoints({ uploadMedia: ctx.getMediaUploaderUri(identifier) })
2825
+ }));
2826
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/")));
2827
+ assertEquals((await federation.fetch(new Request("https://example.com/users/john", { headers: { accept: "application/activity+json" } }), { contextData: void 0 })).status, 200);
2828
+ assertEquals(records.some((record) => typeof record.rawMessage === "string" && record.rawMessage.includes("endpoints.uploadMedia")), false);
2829
+ } finally {
2830
+ await reset();
2831
+ }
2832
+ });
2833
+ });
2834
+ await t.step("warns once when no authorize hook is configured", async () => {
2835
+ await withLogtapeLock(async () => {
2836
+ const records = [];
2837
+ await reset();
2838
+ try {
2839
+ await configure({
2840
+ sinks: { buffer(record) {
2841
+ records.push(record);
2842
+ } },
2843
+ filters: {},
2844
+ loggers: [{
2845
+ category: [],
2846
+ sinks: ["buffer"]
2847
+ }]
2848
+ });
2849
+ const federation = createFederation({
2850
+ kv,
2851
+ documentLoaderFactory: () => mockDocumentLoader
2852
+ });
2853
+ federation.setActorDispatcher("/users/{identifier}", () => new vocab.Person({}));
2854
+ federation.setMediaUploader("/users/{identifier}/media", () => Promise.resolve(new URL("https://example.com/")));
2855
+ const send = () => federation.fetch(new Request("https://example.com/users/john/media", {
2856
+ method: "POST",
2857
+ body: makeUploadForm()
2858
+ }), { contextData: void 0 });
2859
+ assertEquals((await send()).status, 202);
2860
+ assertEquals((await send()).status, 202);
2861
+ assertEquals(records.filter((record) => record.category.join(".") === "fedify.federation.mediaUploader" && record.level === "warning" && typeof record.rawMessage === "string" && record.rawMessage.includes("without an authorize() hook")).length, 1);
2862
+ } finally {
2863
+ await reset();
2864
+ }
2865
+ });
2866
+ });
2867
+ });
2420
2868
  test("Federation.fetch() preserves original LD-signed payload for InboxContextImpl.activity", async () => {
2421
2869
  const remoteContextUrl = "https://remote.example/contexts/ext";
2422
2870
  const sourceContextLoader = async (resource) => {
@@ -1,12 +1,13 @@
1
- const { Temporal } = require("@js-temporal/polyfill");
2
1
  const { URLPattern } = require("urlpattern-polyfill");
3
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
- require("../chunk-DDcVe30Y.cjs");
5
- const require_middleware = require("../middleware-DszmUorL.cjs");
3
+ require("../chunk-Czpeue4M.cjs");
4
+ const require_middleware = require("../middleware-nmfhGFtV.cjs");
5
+ const require_temporal_polyfill = require("../temporal-polyfill-BCdTHexd.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");
9
9
  //#region src/federation/kv.ts
10
+ const Temporal = require_temporal_polyfill.Temporal;
10
11
  /**
11
12
  * A key–value store that stores values in memory.
12
13
  * Do not use this in production as it does not persist values.
@@ -1,6 +1,6 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { $ as CircuitBreakerFailurePolicy, A as Rfc6570Expression, At as WebFingerLinksDispatcher, B as TaskHandler, C as FederationStartQueueOptions, Ct as OutboxErrorHandler, D as InboxListenerSetters, Dt as SharedInboxKeyDispatcher, E as InboxChallengePolicy, Et as OutboxPermanentFailureHandler, F as Message, Ft as digest, G as createExponentialBackoffPolicy, H as CreateExponentialBackoffPolicyOptions, I as createFederationBuilder, J as respondWithObjectIfAcceptable, K as RespondWithObjectOptions, L as TaskDefinition, M as FederationOrigin, Mt as SenderKeyPair, N as FederationQueueOptions, Nt as PageItems, O as ObjectCallbackSetters, Ot as UnverifiedActivityHandler, P as createFederation, Pt as buildCollectionSynchronizationHeader, Q as CircuitBreakerCreateOptions, R as TaskDefinitionOptions, S as FederationOptions, St as ObjectDispatcher, T as IdempotencyStrategy, Tt as OutboxListenerErrorHandler, U as RetryContext, V as TaskRegistry, W as RetryPolicy, X as CircuitBreakerActivityDrop, Y as CircuitBreaker, Z as CircuitBreakerBeforeSendDecision, _ as Federatable, _t as CustomCollectionDispatcher, a as GetSignedKeyOptions, at as normalizeCircuitBreakerOptions, b as FederationBuilder, bt as NodeInfoDispatcher, c as ParseUriResult, ct as ActorDispatcher, d as SendActivityOptions, dt as AuthorizePredicate, et as CircuitBreakerKvState, f as SendActivityOptionsForCollection, ft as CollectionCounter, g as CustomCollectionCallbackSetters, gt as CustomCollectionCursor, h as ConstructorWithTypeId, ht as CustomCollectionCounter, i as GetActorOptions, it as NormalizedCircuitBreakerOptions, j as FederationKvPrefixes, jt as SendActivityError, k as OutboxListenerSetters, kt as UnverifiedActivityReason, l as RequestContext, lt as ActorHandleMapper, m as CollectionCallbackSetters, mt as CollectionDispatcher, n as Context, nt as CircuitBreakerState, o as InboxContext, ot as parseCircuitBreakerKvState, p as ActorCallbackSetters, pt as CollectionCursor, q as respondWithObject, r as ForwardActivityOptions, rt as CircuitBreakerStateChange, s as OutboxContext, st as ActorAliasMapper, t as ActorKeyPair, tt as CircuitBreakerOptions, u as RouteActivityOptions, ut as ActorKeyPairsDispatcher, v as Federation, vt as InboxErrorHandler, w as IdempotencyKeyCallback, wt as OutboxListener, x as FederationFetchOptions, xt as ObjectAuthorizePredicate, y as FederationBenchmarkOptions, yt as InboxListener, z as TaskEnqueueOptions } from "../context-BLe0NPtZ.cjs";
2
+ import { $ as CircuitBreakerCreateOptions, A as OutboxListenerSetters, At as UnverifiedActivityHandler, B as TaskEnqueueOptions, C as FederationStartQueueOptions, Ct as ObjectAuthorizePredicate, D as InboxListenerSetters, Dt as OutboxListenerErrorHandler, E as InboxChallengePolicy, Et as OutboxListener, F as createFederation, Ft as PageItems, G as RetryPolicy, H as TaskRegistry, I as Message, It as buildCollectionSynchronizationHeader, J as respondWithObject, K as createExponentialBackoffPolicy, L as createFederationBuilder, Lt as digest, M as FederationKvPrefixes, Mt as WebFingerLinksDispatcher, N as FederationOrigin, Nt as SendActivityError, O as MediaUploaderSetters, Ot as OutboxPermanentFailureHandler, P as FederationQueueOptions, Pt as SenderKeyPair, Q as CircuitBreakerBeforeSendDecision, R as TaskDefinition, S as FederationOptions, St as NodeInfoDispatcher, T as IdempotencyStrategy, Tt as OutboxErrorHandler, U as CreateExponentialBackoffPolicyOptions, V as TaskHandler, W as RetryContext, X as CircuitBreaker, Y as respondWithObjectIfAcceptable, Z as CircuitBreakerActivityDrop, _ as Federatable, _t as CustomCollectionCursor, a as GetSignedKeyOptions, at as NormalizedCircuitBreakerOptions, b as FederationBuilder, bt as InboxListener, c as ParseUriResult, ct as ActorAliasMapper, d as SendActivityOptions, dt as ActorKeyPairsDispatcher, et as CircuitBreakerFailurePolicy, f as SendActivityOptionsForCollection, ft as AuthorizePredicate, g as CustomCollectionCallbackSetters, gt as CustomCollectionCounter, h as ConstructorWithTypeId, ht as CollectionDispatcher, i as GetActorOptions, it as CircuitBreakerStateChange, j as Rfc6570Expression, jt as UnverifiedActivityReason, k as ObjectCallbackSetters, kt as SharedInboxKeyDispatcher, l as RequestContext, lt as ActorDispatcher, m as CollectionCallbackSetters, mt as CollectionCursor, n as Context, nt as CircuitBreakerOptions, o as InboxContext, ot as normalizeCircuitBreakerOptions, p as ActorCallbackSetters, pt as CollectionCounter, q as RespondWithObjectOptions, r as ForwardActivityOptions, rt as CircuitBreakerState, s as OutboxContext, st as parseCircuitBreakerKvState, t as ActorKeyPair, tt as CircuitBreakerKvState, u as RouteActivityOptions, ut as ActorHandleMapper, v as Federation, vt as CustomCollectionDispatcher, w as IdempotencyKeyCallback, wt as ObjectDispatcher, x as FederationFetchOptions, xt as MediaUploaderCallback, y as FederationBenchmarkOptions, yt as InboxErrorHandler, z as TaskDefinitionOptions } from "../context-lxX6I7as.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 MessageQueueDepth, c as ParallelMessageQueue, i as MessageQueue, n as InProcessMessageQueue, o as MessageQueueEnqueueOptions, r as InProcessMessageQueueOptions, s as MessageQueueListenOptions } from "../metrics-CoUJLQhZ.cjs";
5
- import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-B8Efb9qp.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, TaskDefinition, TaskDefinitionOptions, TaskEnqueueOptions, TaskHandler, TaskRegistry, 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-gOlPDuT8.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, MediaUploaderCallback, MediaUploaderSetters, 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, TaskDefinition, TaskDefinitionOptions, TaskEnqueueOptions, TaskHandler, TaskRegistry, 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 CircuitBreakerFailurePolicy, A as Rfc6570Expression, At as WebFingerLinksDispatcher, B as TaskHandler, C as FederationStartQueueOptions, Ct as OutboxErrorHandler, D as InboxListenerSetters, Dt as SharedInboxKeyDispatcher, E as InboxChallengePolicy, Et as OutboxPermanentFailureHandler, F as Message, Ft as digest, G as createExponentialBackoffPolicy, H as CreateExponentialBackoffPolicyOptions, I as createFederationBuilder, J as respondWithObjectIfAcceptable, K as RespondWithObjectOptions, L as TaskDefinition, M as FederationOrigin, Mt as SenderKeyPair, N as FederationQueueOptions, Nt as PageItems, O as ObjectCallbackSetters, Ot as UnverifiedActivityHandler, P as createFederation, Pt as buildCollectionSynchronizationHeader, Q as CircuitBreakerCreateOptions, R as TaskDefinitionOptions, S as FederationOptions, St as ObjectDispatcher, T as IdempotencyStrategy, Tt as OutboxListenerErrorHandler, U as RetryContext, V as TaskRegistry, W as RetryPolicy, X as CircuitBreakerActivityDrop, Y as CircuitBreaker, Z as CircuitBreakerBeforeSendDecision, _ as Federatable, _t as CustomCollectionDispatcher, a as GetSignedKeyOptions, at as normalizeCircuitBreakerOptions, b as FederationBuilder, bt as NodeInfoDispatcher, c as ParseUriResult, ct as ActorDispatcher, d as SendActivityOptions, dt as AuthorizePredicate, et as CircuitBreakerKvState, f as SendActivityOptionsForCollection, ft as CollectionCounter, g as CustomCollectionCallbackSetters, gt as CustomCollectionCursor, h as ConstructorWithTypeId, ht as CustomCollectionCounter, i as GetActorOptions, it as NormalizedCircuitBreakerOptions, j as FederationKvPrefixes, jt as SendActivityError, k as OutboxListenerSetters, kt as UnverifiedActivityReason, l as RequestContext, lt as ActorHandleMapper, m as CollectionCallbackSetters, mt as CollectionDispatcher, n as Context, nt as CircuitBreakerState, o as InboxContext, ot as parseCircuitBreakerKvState, p as ActorCallbackSetters, pt as CollectionCursor, q as respondWithObject, r as ForwardActivityOptions, rt as CircuitBreakerStateChange, s as OutboxContext, st as ActorAliasMapper, t as ActorKeyPair, tt as CircuitBreakerOptions, u as RouteActivityOptions, ut as ActorKeyPairsDispatcher, v as Federation, vt as InboxErrorHandler, w as IdempotencyKeyCallback, wt as OutboxListener, x as FederationFetchOptions, xt as ObjectAuthorizePredicate, y as FederationBenchmarkOptions, yt as InboxListener, z as TaskEnqueueOptions } from "../context-GfQA-CqB.js";
2
+ import { $ as CircuitBreakerCreateOptions, A as OutboxListenerSetters, At as UnverifiedActivityHandler, B as TaskEnqueueOptions, C as FederationStartQueueOptions, Ct as ObjectAuthorizePredicate, D as InboxListenerSetters, Dt as OutboxListenerErrorHandler, E as InboxChallengePolicy, Et as OutboxListener, F as createFederation, Ft as PageItems, G as RetryPolicy, H as TaskRegistry, I as Message, It as buildCollectionSynchronizationHeader, J as respondWithObject, K as createExponentialBackoffPolicy, L as createFederationBuilder, Lt as digest, M as FederationKvPrefixes, Mt as WebFingerLinksDispatcher, N as FederationOrigin, Nt as SendActivityError, O as MediaUploaderSetters, Ot as OutboxPermanentFailureHandler, P as FederationQueueOptions, Pt as SenderKeyPair, Q as CircuitBreakerBeforeSendDecision, R as TaskDefinition, S as FederationOptions, St as NodeInfoDispatcher, T as IdempotencyStrategy, Tt as OutboxErrorHandler, U as CreateExponentialBackoffPolicyOptions, V as TaskHandler, W as RetryContext, X as CircuitBreaker, Y as respondWithObjectIfAcceptable, Z as CircuitBreakerActivityDrop, _ as Federatable, _t as CustomCollectionCursor, a as GetSignedKeyOptions, at as NormalizedCircuitBreakerOptions, b as FederationBuilder, bt as InboxListener, c as ParseUriResult, ct as ActorAliasMapper, d as SendActivityOptions, dt as ActorKeyPairsDispatcher, et as CircuitBreakerFailurePolicy, f as SendActivityOptionsForCollection, ft as AuthorizePredicate, g as CustomCollectionCallbackSetters, gt as CustomCollectionCounter, h as ConstructorWithTypeId, ht as CollectionDispatcher, i as GetActorOptions, it as CircuitBreakerStateChange, j as Rfc6570Expression, jt as UnverifiedActivityReason, k as ObjectCallbackSetters, kt as SharedInboxKeyDispatcher, l as RequestContext, lt as ActorDispatcher, m as CollectionCallbackSetters, mt as CollectionCursor, n as Context, nt as CircuitBreakerOptions, o as InboxContext, ot as normalizeCircuitBreakerOptions, p as ActorCallbackSetters, pt as CollectionCounter, q as RespondWithObjectOptions, r as ForwardActivityOptions, rt as CircuitBreakerState, s as OutboxContext, st as parseCircuitBreakerKvState, t as ActorKeyPair, tt as CircuitBreakerKvState, u as RouteActivityOptions, ut as ActorHandleMapper, v as Federation, vt as CustomCollectionDispatcher, w as IdempotencyKeyCallback, wt as ObjectDispatcher, x as FederationFetchOptions, xt as MediaUploaderCallback, y as FederationBenchmarkOptions, yt as InboxErrorHandler, z as TaskDefinitionOptions } from "../context-Zii1f5xS.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 MessageQueueDepth, c as ParallelMessageQueue, i as MessageQueue, n as InProcessMessageQueue, o as MessageQueueEnqueueOptions, r as InProcessMessageQueueOptions, s as MessageQueueListenOptions } from "../metrics-Dc4jR-IC.js";
5
- import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-Cmr39iWq.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, TaskDefinition, TaskDefinitionOptions, TaskEnqueueOptions, TaskHandler, TaskRegistry, 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-DLc2Ot6f.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, MediaUploaderCallback, MediaUploaderSetters, 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, TaskDefinition, TaskDefinitionOptions, TaskEnqueueOptions, TaskHandler, TaskRegistry, UnverifiedActivityHandler, UnverifiedActivityReason, WebFingerHandlerParameters, WebFingerLinksDispatcher, buildCollectionSynchronizationHeader, createExponentialBackoffPolicy, createFederation, createFederationBuilder, digest, handleWebFinger, normalizeCircuitBreakerOptions, parseCircuitBreakerKvState, respondWithObject, respondWithObjectIfAcceptable };
@@ -1,6 +1,6 @@
1
- import { Temporal } from "@js-temporal/polyfill";
1
+ import { Temporal } from "temporal-polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { a as ParallelMessageQueue, c as respondWithObject, d as digest, f as CircuitBreaker, h as createFederationBuilder, i as InProcessMessageQueue, l as respondWithObjectIfAcceptable, m as parseCircuitBreakerKvState, o as createExponentialBackoffPolicy, p as normalizeCircuitBreakerOptions, r as handleWebFinger, s as SendActivityError, t as createFederation, u as buildCollectionSynchronizationHeader } from "../middleware-B1jZw4xB.js";
3
+ import { a as ParallelMessageQueue, c as respondWithObject, d as digest, f as CircuitBreaker, h as createFederationBuilder, i as InProcessMessageQueue, l as respondWithObjectIfAcceptable, m as parseCircuitBreakerKvState, o as createExponentialBackoffPolicy, p as normalizeCircuitBreakerOptions, r as handleWebFinger, s as SendActivityError, t as createFederation, u as buildCollectionSynchronizationHeader } from "../middleware-kQ-qwTDh.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";
@@ -1,2 +1,2 @@
1
- import { Temporal } from "@js-temporal/polyfill";
1
+ import { Temporal } from "temporal-polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
@@ -1,11 +1,11 @@
1
- import { Temporal } from "@js-temporal/polyfill";
1
+ import { Temporal } from "temporal-polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { t as assertEquals } from "../assert_equals-PBVKNMJd.mjs";
5
- import { n as assertGreater } from "../std__assert-Dh6uLf_q.mjs";
6
- import { n as assertGreaterOrEqual, r as assertFalse, t as assertRejects } from "../assert_rejects-DAdaaIWM.mjs";
7
- import { t as assert } from "../assert-DvVHoIZ0.mjs";
8
- import { n as ParallelMessageQueue, t as InProcessMessageQueue } from "../mq-03vS-C9P.mjs";
4
+ import { t as assertEquals } from "../assert_equals-BV7oLMxm.mjs";
5
+ import { n as assertGreater } from "../std__assert-B2NnY9bq.mjs";
6
+ import { n as assertGreaterOrEqual, r as assertFalse, t as assertRejects } from "../assert_rejects-EgstcQy5.mjs";
7
+ import { t as assert } from "../assert-CJ1KXcvv.mjs";
8
+ import { n as ParallelMessageQueue, t as InProcessMessageQueue } from "../mq-llHKivST.mjs";
9
9
  import { delay } from "es-toolkit";
10
10
  import { test } from "@fedify/fixture";
11
11
  //#region src/federation/mq.test.ts
@@ -1,2 +1,2 @@
1
- import { Temporal } from "@js-temporal/polyfill";
1
+ import { Temporal } from "temporal-polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";