@fedify/fedify 2.0.29-dev.2096 → 2.0.29-dev.2121

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 (57) hide show
  1. package/dist/{builder-BcvxEZKX.mjs → builder-CcdhtqZA.mjs} +3 -3
  2. package/dist/compat/transformers.test.mjs +1 -1
  3. package/dist/{deno-Cmv-pCm8.mjs → deno-t1Hq3o4g.mjs} +1 -1
  4. package/dist/{docloader-D4yRGK7K.mjs → docloader-DmksBzVa.mjs} +2 -2
  5. package/dist/federation/builder.test.mjs +2 -2
  6. package/dist/federation/collection.test.mjs +1 -1
  7. package/dist/federation/handler.test.mjs +7 -7
  8. package/dist/federation/idempotency.test.mjs +3 -3
  9. package/dist/federation/inbox.test.mjs +1 -1
  10. package/dist/federation/kv.test.mjs +1 -1
  11. package/dist/federation/middleware.test.mjs +32 -7
  12. package/dist/federation/mod.cjs +1 -1
  13. package/dist/federation/mod.js +1 -1
  14. package/dist/federation/mq.test.mjs +98 -43
  15. package/dist/federation/negotiation.test.mjs +1 -1
  16. package/dist/federation/router.test.mjs +1 -1
  17. package/dist/federation/send.test.mjs +4 -4
  18. package/dist/federation/temporal.test.mjs +2 -2
  19. package/dist/federation/webfinger.test.mjs +2 -2
  20. package/dist/{http-DUhfTNYc.cjs → http-6cUjmZau.cjs} +6 -2
  21. package/dist/{http-L83xbCXG.js → http-CBZxo485.js} +6 -2
  22. package/dist/{http-BO446axb.mjs → http-DscVc8UW.mjs} +7 -3
  23. package/dist/{inbox-L_6BmE2i.mjs → inbox-CKKOBg0X.mjs} +1 -1
  24. package/dist/{key-DPJmeIuq.mjs → key-BMxcDQ7Z.mjs} +1 -1
  25. package/dist/{kv-cache-Ctg7CnWG.cjs → kv-cache-BV20L2x4.cjs} +1 -1
  26. package/dist/{kv-cache-B4fx_uVi.js → kv-cache-OZi_bDmv.js} +1 -1
  27. package/dist/{ld-CRF7lyrS.mjs → ld-uaq9Uc9i.mjs} +3 -3
  28. package/dist/{middleware-DCo4yvzF.cjs → middleware-Bhbzx0XA.cjs} +4 -4
  29. package/dist/{middleware-Bisq4a0S.mjs → middleware-Cf7qPU7x.mjs} +1 -1
  30. package/dist/{middleware-k55i1cGt.mjs → middleware-D5XEd8l9.mjs} +11 -11
  31. package/dist/{middleware-Bv8nmnSs.cjs → middleware-DUALf6gS.cjs} +1 -1
  32. package/dist/{middleware-BJ9bf3TC.js → middleware-w_QMTb52.js} +3 -3
  33. package/dist/mod.cjs +4 -4
  34. package/dist/mod.js +4 -4
  35. package/dist/nodeinfo/client.test.mjs +1 -1
  36. package/dist/nodeinfo/handler.test.mjs +2 -2
  37. package/dist/nodeinfo/types.test.mjs +1 -1
  38. package/dist/otel/exporter.test.mjs +1 -1
  39. package/dist/{owner-CzyGUO2V.mjs → owner-Ds5LSYBk.mjs} +2 -2
  40. package/dist/{proof-C5RSnFgT.mjs → proof-2v-RNn_n.mjs} +2 -2
  41. package/dist/{proof-BXCmXpPp.cjs → proof-C5gSPzjd.cjs} +2 -2
  42. package/dist/{proof-dnt7DNOm.js → proof-zSRThRNk.js} +2 -2
  43. package/dist/{send-GF-lyxJ8.mjs → send-Dvu09tKp.mjs} +2 -2
  44. package/dist/sig/http.test.mjs +43 -3
  45. package/dist/sig/key.test.mjs +2 -2
  46. package/dist/sig/ld.test.mjs +5 -2
  47. package/dist/sig/mod.cjs +2 -2
  48. package/dist/sig/mod.js +2 -2
  49. package/dist/sig/owner.test.mjs +2 -2
  50. package/dist/sig/proof.test.mjs +2 -2
  51. package/dist/{std__assert-Duiq_YC9.mjs → std__assert-BUOJXi-Z.mjs} +1 -26
  52. package/dist/{temporal-BENj2PAS.mjs → temporal-BAJ8SH-_.mjs} +1 -1
  53. package/dist/utils/docloader.test.mjs +3 -3
  54. package/dist/utils/mod.cjs +1 -1
  55. package/dist/utils/mod.js +1 -1
  56. package/dist/vocab/cjs.test.mjs +1 -1
  57. package/package.json +7 -7
@@ -2,8 +2,8 @@ import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as RouterError, t as Router } from "./router-CrMLXoOr.mjs";
5
- import { n as version, t as name } from "./deno-Cmv-pCm8.mjs";
6
- import { t as InboxListenerSet } from "./inbox-L_6BmE2i.mjs";
5
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
6
+ import { t as InboxListenerSet } from "./inbox-CKKOBg0X.mjs";
7
7
  import { getTypeId } from "@fedify/vocab";
8
8
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
9
9
  import { getLogger } from "@logtape/logtape";
@@ -42,7 +42,7 @@ var FederationBuilderImpl = class {
42
42
  this.collectionTypeIds = {};
43
43
  }
44
44
  async build(options) {
45
- const { FederationImpl } = await import("./middleware-Bisq4a0S.mjs");
45
+ const { FederationImpl } = await import("./middleware-Cf7qPU7x.mjs");
46
46
  const f = new FederationImpl(options);
47
47
  const trailingSlashInsensitiveValue = f.router.trailingSlashInsensitive;
48
48
  f.router = this.router.clone();
@@ -4,7 +4,7 @@ globalThis.addEventListener = () => {};
4
4
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import { n as assertInstanceOf, t as assert } from "../assert-BhQd8QHP.mjs";
6
6
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
7
- import { _ as autoIdAssigner, g as actorDehydrator, n as FederationImpl } from "../middleware-k55i1cGt.mjs";
7
+ import { _ as autoIdAssigner, g as actorDehydrator, n as FederationImpl } from "../middleware-D5XEd8l9.mjs";
8
8
  import { test } from "@fedify/fixture";
9
9
  import { Follow, Person } from "@fedify/vocab";
10
10
  //#region src/compat/transformers.test.ts
@@ -3,6 +3,6 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  //#region deno.json
5
5
  var name = "@fedify/fedify";
6
- var version = "2.0.29-dev.2096+a1659cb1";
6
+ var version = "2.0.29-dev.2121+c46fb9dd";
7
7
  //#endregion
8
8
  export { version as n, name as t };
@@ -1,8 +1,8 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { o as validateCryptoKey } from "./key-DPJmeIuq.mjs";
5
- import { n as doubleKnock } from "./http-BO446axb.mjs";
4
+ import { o as validateCryptoKey } from "./key-BMxcDQ7Z.mjs";
5
+ import { n as doubleKnock } from "./http-DscVc8UW.mjs";
6
6
  import { curry } from "es-toolkit";
7
7
  import { UrlError, createActivityPubRequest, getRemoteDocument, logRequest, validatePublicUrl } from "@fedify/vocab-runtime";
8
8
  import { getLogger } from "@logtape/logtape";
@@ -2,10 +2,10 @@ import "@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 { a as assertExists } from "../std__assert-Duiq_YC9.mjs";
5
+ import { i as assertExists } from "../std__assert-BUOJXi-Z.mjs";
6
6
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
7
7
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
8
- import { n as createFederationBuilder } from "../builder-BcvxEZKX.mjs";
8
+ import { n as createFederationBuilder } from "../builder-CcdhtqZA.mjs";
9
9
  import { test } from "@fedify/fixture";
10
10
  import { Activity, Note, Person } from "@fedify/vocab";
11
11
  //#region src/federation/builder.test.ts
@@ -2,7 +2,7 @@ import "@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 "../std__assert-Duiq_YC9.mjs";
5
+ import "../std__assert-BUOJXi-Z.mjs";
6
6
  import { n as digest, t as buildCollectionSynchronizationHeader } from "../collection-DI6YzYpd.mjs";
7
7
  import { test } from "@fedify/fixture";
8
8
  import { decodeHex } from "byte-encodings/hex";
@@ -3,17 +3,17 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as createRequestContext, t as createInboxContext } from "../context-Juj6bdHC.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
- import "../std__assert-Duiq_YC9.mjs";
6
+ import "../std__assert-BUOJXi-Z.mjs";
7
7
  import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
8
8
  import { t as assert } from "../assert-BhQd8QHP.mjs";
9
- import { i as generateCryptoKeyPair } from "../key-DPJmeIuq.mjs";
10
- import { s as signRequest } from "../http-BO446axb.mjs";
9
+ import { i as generateCryptoKeyPair } from "../key-BMxcDQ7Z.mjs";
10
+ import { s as signRequest } from "../http-DscVc8UW.mjs";
11
11
  import { a as rsaPrivateKey3, c as rsaPublicKey3, s as rsaPublicKey2 } from "../keys-CCxRJhWa.mjs";
12
- import { a as compactJsonLd, f as signJsonLd } from "../ld-CRF7lyrS.mjs";
13
- import { n as signObject } from "../proof-C5RSnFgT.mjs";
12
+ import { a as compactJsonLd, f as signJsonLd } from "../ld-uaq9Uc9i.mjs";
13
+ import { n as signObject } from "../proof-2v-RNn_n.mjs";
14
14
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
15
- import { a as createFederation, c as handleCollection, d as handleObject, f as respondWithObject, l as handleCustomCollection, p as respondWithObjectIfAcceptable, s as handleActor, u as handleInbox } from "../middleware-k55i1cGt.mjs";
16
- import { t as InboxListenerSet } from "../inbox-L_6BmE2i.mjs";
15
+ import { a as createFederation, c as handleCollection, d as handleObject, f as respondWithObject, l as handleCustomCollection, p as respondWithObjectIfAcceptable, s as handleActor, u as handleInbox } from "../middleware-D5XEd8l9.mjs";
16
+ import { t as InboxListenerSet } from "../inbox-CKKOBg0X.mjs";
17
17
  import { createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
18
18
  import { Create, CryptographicKey, Multikey, Note, Person } from "@fedify/vocab";
19
19
  //#region src/federation/handler.test.ts
@@ -2,11 +2,11 @@ import "@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 "../std__assert-Duiq_YC9.mjs";
5
+ import "../std__assert-BUOJXi-Z.mjs";
6
6
  import { n as ed25519PrivateKey, r as ed25519PublicKey, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
7
- import { n as signObject } from "../proof-C5RSnFgT.mjs";
7
+ import { n as signObject } from "../proof-2v-RNn_n.mjs";
8
8
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
9
- import { a as createFederation } from "../middleware-k55i1cGt.mjs";
9
+ import { a as createFederation } from "../middleware-D5XEd8l9.mjs";
10
10
  import { mockDocumentLoader, test } from "@fedify/fixture";
11
11
  import { Create, Follow, Person } from "@fedify/vocab";
12
12
  //#region src/federation/idempotency.test.ts
@@ -3,7 +3,7 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
6
- import { t as InboxListenerSet } from "../inbox-L_6BmE2i.mjs";
6
+ import { t as InboxListenerSet } from "../inbox-CKKOBg0X.mjs";
7
7
  import { test } from "@fedify/fixture";
8
8
  import { Activity, Create, Invite, Offer, Update } from "@fedify/vocab";
9
9
  //#region src/federation/inbox.test.ts
@@ -2,7 +2,7 @@ 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 "../std__assert-Duiq_YC9.mjs";
5
+ import "../std__assert-BUOJXi-Z.mjs";
6
6
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
7
7
  import { test } from "@fedify/fixture";
8
8
  //#region src/federation/kv.test.ts
@@ -4,19 +4,19 @@ globalThis.addEventListener = () => {};
4
4
  import { t as esm_default } from "../esm-DVILvP5e.mjs";
5
5
  import { n as RouterError } from "../router-CrMLXoOr.mjs";
6
6
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
7
- import { n as assertStrictEquals } from "../std__assert-Duiq_YC9.mjs";
7
+ import { n as assertStrictEquals } from "../std__assert-BUOJXi-Z.mjs";
8
8
  import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
9
9
  import { n as assertInstanceOf, t as assert } from "../assert-BhQd8QHP.mjs";
10
10
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
11
11
  import { t as assertNotEquals } from "../assert_not_equals--wG9hV7u.mjs";
12
- import { l as verifyRequest, s as signRequest } from "../http-BO446axb.mjs";
12
+ import { l as verifyRequest, s as signRequest } from "../http-DscVc8UW.mjs";
13
13
  import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
14
- import { t as getAuthenticatedDocumentLoader } from "../docloader-D4yRGK7K.mjs";
15
- import { a as compactJsonLd, f as signJsonLd, m as verifyJsonLd, s as detachSignature } from "../ld-CRF7lyrS.mjs";
16
- import { t as doesActorOwnKey } from "../owner-CzyGUO2V.mjs";
17
- import { n as signObject, r as verifyObject } from "../proof-C5RSnFgT.mjs";
14
+ import { t as getAuthenticatedDocumentLoader } from "../docloader-DmksBzVa.mjs";
15
+ import { a as compactJsonLd, f as signJsonLd, m as verifyJsonLd, s as detachSignature } from "../ld-uaq9Uc9i.mjs";
16
+ import { t as doesActorOwnKey } from "../owner-Ds5LSYBk.mjs";
17
+ import { n as signObject, r as verifyObject } from "../proof-2v-RNn_n.mjs";
18
18
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
19
- import { a as createFederation, i as KvSpecDeterminer, n as FederationImpl, r as InboxContextImpl, t as ContextImpl } from "../middleware-k55i1cGt.mjs";
19
+ import { a as createFederation, i as KvSpecDeterminer, n as FederationImpl, r as InboxContextImpl, t as ContextImpl } from "../middleware-D5XEd8l9.mjs";
20
20
  import { mockDocumentLoader, test } from "@fedify/fixture";
21
21
  import * as vocab from "@fedify/vocab";
22
22
  import { Create, Offer, Person, getTypeId, lookupObject } from "@fedify/vocab";
@@ -705,6 +705,31 @@ test({
705
705
  esm_default.hardReset();
706
706
  }
707
707
  });
708
+ test("Federation.fetch() [rfc9421] multiple POST signatures", async (t) => {
709
+ for (const validSecond of [true, false]) await t.step(validSecond ? "valid second signature" : "both signatures invalid", async () => {
710
+ const inbox = [];
711
+ const federation = createFederation({
712
+ kv: new MemoryKvStore(),
713
+ documentLoaderFactory: () => mockDocumentLoader,
714
+ contextLoaderFactory: () => mockDocumentLoader
715
+ });
716
+ federation.setActorDispatcher("/users/{identifier}", (ctx, identifier) => new vocab.Person({ id: ctx.getActorUri(identifier) }));
717
+ federation.setInboxListeners("/users/{identifier}/inbox", "/inbox").on(vocab.Create, (_ctx, activity) => {
718
+ inbox.push(activity.id.href);
719
+ });
720
+ const signed = await signRequest(new Request("https://example.com/inbox", {
721
+ method: "POST",
722
+ headers: { "Content-Type": "application/activity+json" },
723
+ body: JSON.stringify(create_default)
724
+ }), rsaPrivateKey2, rsaPublicKey2.id, { spec: "rfc9421" });
725
+ const input = signed.headers.get("Signature-Input");
726
+ const signature = signed.headers.get("Signature");
727
+ signed.headers.set("Signature-Input", `${input}, ${input.replace(/^sig1=/, "sig2=")}`);
728
+ signed.headers.set("Signature", `sig1=:AAAAAA==:, ${validSecond ? signature.replace(/^sig1=/, "sig2=") : "sig2=:AAAAAA==:"}`);
729
+ assertEquals((await federation.fetch(signed, { contextData: void 0 })).status, validSecond ? 202 : 401);
730
+ assertEquals(inbox, validSecond ? [id$2] : []);
731
+ });
732
+ });
708
733
  test("Federation.fetch()", async (t) => {
709
734
  esm_default.spyGlobal();
710
735
  esm_default.get("https://example.com/key2", {
@@ -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-DCo4yvzF.cjs");
5
+ const require_middleware = require("../middleware-Bhbzx0XA.cjs");
6
6
  let es_toolkit = require("es-toolkit");
7
7
  //#region src/federation/kv.ts
8
8
  /**
@@ -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-BJ9bf3TC.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-w_QMTb52.js";
4
4
  import { isEqual } from "es-toolkit";
5
5
  //#region src/federation/kv.ts
6
6
  /**
@@ -2,7 +2,7 @@ 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 { i as assertGreaterOrEqual, r as assertGreater } from "../std__assert-Duiq_YC9.mjs";
5
+ import { r as assertGreaterOrEqual } from "../std__assert-BUOJXi-Z.mjs";
6
6
  import { n as assertFalse } from "../assert_rejects-B-qJtC9Z.mjs";
7
7
  import { t as assert } from "../assert-BhQd8QHP.mjs";
8
8
  import { test } from "@fedify/fixture";
@@ -248,50 +248,105 @@ test("InProcessMessageQueue", async (t) => {
248
248
  const listening = mq.listen((message) => {
249
249
  messages.push(message);
250
250
  }, controller);
251
- await t.step("enqueue()", async () => {
252
- await mq.enqueue("Hello, world!");
253
- });
254
- await waitFor(() => messages.length > 0, 15e3);
255
- await t.step("listen()", () => {
256
- assertEquals(messages, ["Hello, world!"]);
257
- });
258
- let started = 0;
259
- await t.step("enqueue() with delay", async () => {
260
- started = Date.now();
261
- await mq.enqueue("Delayed message", { delay: Temporal.Duration.from({ seconds: 3 }) });
262
- assertEquals(messages, ["Hello, world!"]);
263
- });
264
- await waitFor(() => messages.length > 1, 15e3);
265
- await t.step("listen() with delay", () => {
266
- assertEquals(messages, ["Hello, world!", "Delayed message"]);
267
- assertGreater(Date.now() - started, 3e3);
268
- });
269
- while (messages.length > 0) messages.pop();
270
- await t.step("enqueueMany()", async () => {
271
- const testMessages = Array.from({ length: 5 }, (_, i) => `Batch message ${i}!`);
272
- await mq.enqueueMany(testMessages);
273
- });
274
- await waitFor(() => messages.length >= 5, 15e3);
275
- await t.step("listen() [multiple]", () => {
276
- assertEquals(messages.length, 5);
277
- for (let i = 0; i < 5; i++) assertEquals(messages[i], `Batch message ${i}!`);
278
- });
279
- while (messages.length > 0) messages.pop();
280
- started = 0;
281
- await t.step("enqueueMany() with delay", async () => {
282
- started = Date.now();
283
- const testMessages = Array.from({ length: 3 }, (_, i) => `Delayed batch ${i}!`);
284
- await mq.enqueueMany(testMessages, { delay: Temporal.Duration.from({ seconds: 2 }) });
285
- assertEquals(messages.length, 0);
251
+ try {
252
+ await t.step("enqueue()", async () => {
253
+ await mq.enqueue("Hello, world!");
254
+ });
255
+ await waitFor(() => messages.length > 0, 15e3);
256
+ await t.step("listen()", () => {
257
+ assertEquals(messages, ["Hello, world!"]);
258
+ });
259
+ await t.step("enqueue() with delay", async () => {
260
+ const { timers, enqueued } = captureTimers(() => mq.enqueue("Delayed message", { delay: Temporal.Duration.from({ seconds: 3 }) }));
261
+ await enqueued;
262
+ assertEquals(timers.length, 1);
263
+ assertEquals(timers[0].delay, 3e3);
264
+ await mq.enqueue("Single delay marker");
265
+ await waitFor(() => messages.includes("Single delay marker"), 15e3);
266
+ assertEquals(messages, ["Hello, world!", "Single delay marker"]);
267
+ timers[0].callback();
268
+ });
269
+ await waitFor(() => messages.length >= 3, 15e3);
270
+ await t.step("listen() with delay", () => {
271
+ assertEquals(messages, [
272
+ "Hello, world!",
273
+ "Single delay marker",
274
+ "Delayed message"
275
+ ]);
276
+ });
277
+ while (messages.length > 0) messages.pop();
278
+ await t.step("enqueueMany()", async () => {
279
+ const testMessages = Array.from({ length: 5 }, (_, i) => `Batch message ${i}!`);
280
+ await mq.enqueueMany(testMessages);
281
+ });
282
+ await waitFor(() => messages.length >= 5, 15e3);
283
+ await t.step("listen() [multiple]", () => {
284
+ assertEquals(messages.length, 5);
285
+ for (let i = 0; i < 5; i++) assertEquals(messages[i], `Batch message ${i}!`);
286
+ });
287
+ while (messages.length > 0) messages.pop();
288
+ await t.step("enqueueMany() with delay", async () => {
289
+ const testMessages = Array.from({ length: 3 }, (_, i) => `Delayed batch ${i}!`);
290
+ const { timers, enqueued } = captureTimers(() => mq.enqueueMany(testMessages, { delay: Temporal.Duration.from({ seconds: 2 }) }));
291
+ await enqueued;
292
+ assertEquals(timers.length, 1);
293
+ assertEquals(timers[0].delay, 2e3);
294
+ await mq.enqueue("Batch delay marker");
295
+ await waitFor(() => messages.includes("Batch delay marker"), 15e3);
296
+ assertEquals(messages, ["Batch delay marker"]);
297
+ timers[0].callback();
298
+ });
299
+ await waitFor(() => messages.length >= 4, 15e3);
300
+ await t.step("listen() [delayed multiple]", () => {
301
+ assertEquals(messages.length, 4);
302
+ assertEquals(messages[0], "Batch delay marker");
303
+ for (let i = 0; i < 3; i++) assertEquals(messages[i + 1], `Delayed batch ${i}!`);
304
+ });
305
+ } finally {
306
+ controller.abort();
307
+ await listening;
308
+ }
309
+ });
310
+ function captureTimers(enqueue) {
311
+ const timers = [];
312
+ const original = globalThis.setTimeout;
313
+ globalThis.setTimeout = ((callback, delay) => {
314
+ timers.push({
315
+ callback,
316
+ delay
317
+ });
318
+ return 0;
286
319
  });
287
- await waitFor(() => messages.length >= 3, 15e3);
288
- await t.step("listen() [delayed multiple]", () => {
289
- assertEquals(messages.length, 3);
290
- assertGreater(Date.now() - started, 2e3);
291
- for (let i = 0; i < 3; i++) assertEquals(messages[i], `Delayed batch ${i}!`);
320
+ try {
321
+ return {
322
+ timers,
323
+ enqueued: enqueue()
324
+ };
325
+ } finally {
326
+ globalThis.setTimeout = original;
327
+ }
328
+ }
329
+ test("InProcessMessageQueue real delay", async (t) => {
330
+ for (const batch of [false, true]) await t.step(batch ? "enqueueMany()" : "enqueue()", async () => {
331
+ const mq = new InProcessMessageQueue();
332
+ const messages = [];
333
+ const controller = new AbortController();
334
+ const listening = mq.listen((message) => {
335
+ messages.push(message);
336
+ }, controller);
337
+ try {
338
+ const delayed = batch ? ["Delayed 1", "Delayed 2"] : ["Delayed"];
339
+ const options = { delay: Temporal.Duration.from({ milliseconds: 100 }) };
340
+ if (batch) await mq.enqueueMany(delayed, options);
341
+ else await mq.enqueue(delayed[0], options);
342
+ await mq.enqueue("Immediate");
343
+ await waitFor(() => messages.length >= delayed.length + 1, 15e3);
344
+ assertEquals(messages, ["Immediate", ...delayed]);
345
+ } finally {
346
+ controller.abort();
347
+ await listening;
348
+ }
292
349
  });
293
- controller.abort();
294
- await listening;
295
350
  });
296
351
  test("InProcessMessageQueue orderingKey", async (t) => {
297
352
  const mq = new InProcessMessageQueue();
@@ -1,7 +1,7 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import "../std__assert-Duiq_YC9.mjs";
4
+ import "../std__assert-BUOJXi-Z.mjs";
5
5
  import { n as assertFalse } from "../assert_rejects-B-qJtC9Z.mjs";
6
6
  import { t as assert } from "../assert-BhQd8QHP.mjs";
7
7
  import { t as acceptsJsonLd } from "../negotiation-TWEs6Cl8.mjs";
@@ -3,7 +3,7 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as RouterError, t as Router } from "../router-CrMLXoOr.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
- import "../std__assert-Duiq_YC9.mjs";
6
+ import "../std__assert-BUOJXi-Z.mjs";
7
7
  import { n as assertFalse } from "../assert_rejects-B-qJtC9Z.mjs";
8
8
  import { t as assert } from "../assert-BhQd8QHP.mjs";
9
9
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
@@ -3,14 +3,14 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { t as esm_default } from "../esm-DVILvP5e.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
- import "../std__assert-Duiq_YC9.mjs";
6
+ import "../std__assert-BUOJXi-Z.mjs";
7
7
  import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
8
8
  import { n as assertInstanceOf, t as assert } from "../assert-BhQd8QHP.mjs";
9
9
  import { t as assertNotEquals } from "../assert_not_equals--wG9hV7u.mjs";
10
- import { l as verifyRequest } from "../http-BO446axb.mjs";
10
+ import { l as verifyRequest } from "../http-DscVc8UW.mjs";
11
11
  import { i as rsaPrivateKey2, n as ed25519PrivateKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
12
- import { t as doesActorOwnKey } from "../owner-CzyGUO2V.mjs";
13
- import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "../send-GF-lyxJ8.mjs";
12
+ import { t as doesActorOwnKey } from "../owner-Ds5LSYBk.mjs";
13
+ import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "../send-Dvu09tKp.mjs";
14
14
  import { createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
15
15
  import { Activity, Application, Endpoints, Group, Person, Service } from "@fedify/vocab";
16
16
  import { FetchError, UrlError } from "@fedify/vocab-runtime";
@@ -1,10 +1,10 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import "../std__assert-Duiq_YC9.mjs";
4
+ import "../std__assert-BUOJXi-Z.mjs";
5
5
  import { n as assertFalse } from "../assert_rejects-B-qJtC9Z.mjs";
6
6
  import { t as assert } from "../assert-BhQd8QHP.mjs";
7
- import { t as hasMalformedKnownTemporalLiteral } from "../temporal-BENj2PAS.mjs";
7
+ import { t as hasMalformedKnownTemporalLiteral } from "../temporal-BAJ8SH-_.mjs";
8
8
  import { test } from "@fedify/fixture";
9
9
  //#region src/federation/temporal.test.ts
10
10
  test("hasMalformedKnownTemporalLiteral() detects expanded proof timestamps", async () => {
@@ -3,9 +3,9 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as createRequestContext } from "../context-Juj6bdHC.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
- import "../std__assert-Duiq_YC9.mjs";
6
+ import "../std__assert-BUOJXi-Z.mjs";
7
7
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
8
- import { a as createFederation, o as handleWebFinger } from "../middleware-k55i1cGt.mjs";
8
+ import { a as createFederation, o as handleWebFinger } from "../middleware-D5XEd8l9.mjs";
9
9
  import { test } from "@fedify/fixture";
10
10
  import { Image, Link, Person } from "@fedify/vocab";
11
11
  //#region src/federation/webfinger.test.ts
@@ -11,7 +11,7 @@ let byte_encodings_base64 = require("byte-encodings/base64");
11
11
  let structured_field_values = require("structured-field-values");
12
12
  //#region deno.json
13
13
  var name = "@fedify/fedify";
14
- var version = "2.0.29-dev.2096+a1659cb1";
14
+ var version = "2.0.29-dev.2121+c46fb9dd";
15
15
  //#endregion
16
16
  //#region src/sig/key.ts
17
17
  /**
@@ -968,6 +968,8 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
968
968
  return null;
969
969
  }
970
970
  let validKey = null;
971
+ let body = null;
972
+ let digestValid = null;
971
973
  for (const sigName of signatureNames) {
972
974
  if (!signatures[sigName]) continue;
973
975
  const sigInput = signatureInputs[sigName];
@@ -1010,7 +1012,9 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
1010
1012
  logger.debug("Failed to verify; Content-Digest header required but not found.", { components: sigInput.components });
1011
1013
  continue;
1012
1014
  }
1013
- if (!await verifyRfc9421ContentDigest(contentDigestHeader, await request.arrayBuffer())) {
1015
+ body ??= await request.arrayBuffer();
1016
+ digestValid ??= await verifyRfc9421ContentDigest(contentDigestHeader, body);
1017
+ if (!digestValid) {
1014
1018
  logger.debug("Failed to verify; Content-Digest verification failed.", { contentDigest: contentDigestHeader });
1015
1019
  continue;
1016
1020
  }
@@ -10,7 +10,7 @@ import { decodeBase64, encodeBase64 } from "byte-encodings/base64";
10
10
  import { Item, decodeDict, encodeItem } from "structured-field-values";
11
11
  //#region deno.json
12
12
  var name = "@fedify/fedify";
13
- var version = "2.0.29-dev.2096+a1659cb1";
13
+ var version = "2.0.29-dev.2121+c46fb9dd";
14
14
  //#endregion
15
15
  //#region src/sig/key.ts
16
16
  /**
@@ -967,6 +967,8 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
967
967
  return null;
968
968
  }
969
969
  let validKey = null;
970
+ let body = null;
971
+ let digestValid = null;
970
972
  for (const sigName of signatureNames) {
971
973
  if (!signatures[sigName]) continue;
972
974
  const sigInput = signatureInputs[sigName];
@@ -1009,7 +1011,9 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
1009
1011
  logger.debug("Failed to verify; Content-Digest header required but not found.", { components: sigInput.components });
1010
1012
  continue;
1011
1013
  }
1012
- if (!await verifyRfc9421ContentDigest(contentDigestHeader, await request.arrayBuffer())) {
1014
+ body ??= await request.arrayBuffer();
1015
+ digestValid ??= await verifyRfc9421ContentDigest(contentDigestHeader, body);
1016
+ if (!digestValid) {
1013
1017
  logger.debug("Failed to verify; Content-Digest verification failed.", { contentDigest: contentDigestHeader });
1014
1018
  continue;
1015
1019
  }
@@ -1,8 +1,8 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-Cmv-pCm8.mjs";
5
- import { o as validateCryptoKey, r as fetchKey } from "./key-DPJmeIuq.mjs";
4
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
5
+ import { o as validateCryptoKey, r as fetchKey } from "./key-BMxcDQ7Z.mjs";
6
6
  import { CryptographicKey } from "@fedify/vocab";
7
7
  import { SpanStatusCode, trace } from "@opentelemetry/api";
8
8
  import { FetchError } from "@fedify/vocab-runtime";
@@ -562,6 +562,8 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
562
562
  return null;
563
563
  }
564
564
  let validKey = null;
565
+ let body = null;
566
+ let digestValid = null;
565
567
  for (const sigName of signatureNames) {
566
568
  if (!signatures[sigName]) continue;
567
569
  const sigInput = signatureInputs[sigName];
@@ -604,7 +606,9 @@ async function verifyRequestRfc9421(request, span, { documentLoader, contextLoad
604
606
  logger.debug("Failed to verify; Content-Digest header required but not found.", { components: sigInput.components });
605
607
  continue;
606
608
  }
607
- if (!await verifyRfc9421ContentDigest(contentDigestHeader, await request.arrayBuffer())) {
609
+ body ??= await request.arrayBuffer();
610
+ digestValid ??= await verifyRfc9421ContentDigest(contentDigestHeader, body);
611
+ if (!digestValid) {
608
612
  logger.debug("Failed to verify; Content-Digest verification failed.", { contentDigest: contentDigestHeader });
609
613
  continue;
610
614
  }
@@ -1,7 +1,7 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-Cmv-pCm8.mjs";
4
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
5
5
  import { Activity, getTypeId } from "@fedify/vocab";
6
6
  import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
7
7
  import { getLogger } from "@logtape/logtape";
@@ -1,7 +1,7 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-Cmv-pCm8.mjs";
4
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
5
5
  import { CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
6
6
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
7
7
  import { getDocumentLoader } from "@fedify/vocab-runtime";
@@ -1,7 +1,7 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  require("./chunk-DDcVe30Y.cjs");
4
- const require_http = require("./http-DUhfTNYc.cjs");
4
+ const require_http = require("./http-6cUjmZau.cjs");
5
5
  let _logtape_logtape = require("@logtape/logtape");
6
6
  let es_toolkit = require("es-toolkit");
7
7
  let _fedify_vocab_runtime = require("@fedify/vocab-runtime");
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { l as validateCryptoKey, t as doubleKnock } from "./http-L83xbCXG.js";
3
+ import { l as validateCryptoKey, t as doubleKnock } from "./http-CBZxo485.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
  import { curry } from "es-toolkit";
6
6
  import { UrlError, createActivityPubRequest, getRemoteDocument, logRequest, preloadedContexts, validatePublicUrl } from "@fedify/vocab-runtime";
@@ -1,8 +1,8 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-Cmv-pCm8.mjs";
5
- import { o as validateCryptoKey, r as fetchKey } from "./key-DPJmeIuq.mjs";
4
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
5
+ import { o as validateCryptoKey, r as fetchKey } from "./key-BMxcDQ7Z.mjs";
6
6
  import { Activity, CryptographicKey, Object as Object$1, getTypeId } from "@fedify/vocab";
7
7
  import { SpanStatusCode, trace } from "@opentelemetry/api";
8
8
  import { getDocumentLoader } from "@fedify/vocab-runtime";
@@ -203,7 +203,7 @@ function normalizeContextReference(reference, baseUrl) {
203
203
  /** @internal */
204
204
  function isInvalidUrlTypeError(error) {
205
205
  const code = error.code;
206
- return error instanceof TypeError && (code === "ERR_INVALID_URL" || /^Invalid URL(?::|$)/.test(error.message) || / cannot be parsed as a URL\.?$/.test(error.message));
206
+ return error instanceof TypeError && (code === "ERR_INVALID_URL" || error.message === "Invalid URL string." || /^Invalid URL(?::|$)/.test(error.message) || / cannot be parsed as a URL\.?$/.test(error.message));
207
207
  }
208
208
  async function applyGraphAliasContext(state, context, documentLoader, remoteContextCache, baseUrl = null, processingContexts = /* @__PURE__ */ new Set()) {
209
209
  if (context === null) return createGraphAliasContextState();
@@ -2,10 +2,10 @@ const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  const require_chunk = require("./chunk-DDcVe30Y.cjs");
4
4
  const require_transformers = require("./transformers-NeAONrAq.cjs");
5
- const require_http = require("./http-DUhfTNYc.cjs");
5
+ const require_http = require("./http-6cUjmZau.cjs");
6
6
  const require_types = require("./types-DRPjmHVV.cjs");
7
- const require_proof = require("./proof-BXCmXpPp.cjs");
8
- const require_kv_cache = require("./kv-cache-Ctg7CnWG.cjs");
7
+ const require_proof = require("./proof-C5gSPzjd.cjs");
8
+ const require_kv_cache = require("./kv-cache-BV20L2x4.cjs");
9
9
  let _logtape_logtape = require("@logtape/logtape");
10
10
  let _fedify_vocab = require("@fedify/vocab");
11
11
  let _opentelemetry_api = require("@opentelemetry/api");
@@ -335,7 +335,7 @@ var FederationBuilderImpl = class {
335
335
  this.collectionTypeIds = {};
336
336
  }
337
337
  async build(options) {
338
- const { FederationImpl } = await Promise.resolve().then(() => require("./middleware-Bv8nmnSs.cjs"));
338
+ const { FederationImpl } = await Promise.resolve().then(() => require("./middleware-DUALf6gS.cjs"));
339
339
  const f = new FederationImpl(options);
340
340
  const trailingSlashInsensitiveValue = f.router.trailingSlashInsensitive;
341
341
  f.router = this.router.clone();
@@ -1,5 +1,5 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as FederationImpl } from "./middleware-k55i1cGt.mjs";
4
+ import { n as FederationImpl } from "./middleware-D5XEd8l9.mjs";
5
5
  export { FederationImpl };
@@ -2,24 +2,24 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as RouterError } from "./router-CrMLXoOr.mjs";
5
- import { n as version, t as name } from "./deno-Cmv-pCm8.mjs";
6
- import { a as importJwk, o as validateCryptoKey, t as exportJwk } from "./key-DPJmeIuq.mjs";
7
- import { l as verifyRequest } from "./http-BO446axb.mjs";
8
- import { t as getAuthenticatedDocumentLoader } from "./docloader-D4yRGK7K.mjs";
5
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
6
+ import { a as importJwk, o as validateCryptoKey, t as exportJwk } from "./key-BMxcDQ7Z.mjs";
7
+ import { l as verifyRequest } from "./http-DscVc8UW.mjs";
8
+ import { t as getAuthenticatedDocumentLoader } from "./docloader-DmksBzVa.mjs";
9
9
  import { n as kvCache } from "./kv-cache-BrjuJue8.mjs";
10
- import { a as compactJsonLd, c as getNormalizationContextLoader, d as isInvalidUrlTypeError, f as signJsonLd, g as wrapContextLoaderForJsonLd, l as hasSignature, p as verifyCompactJsonLd, r as assertSafeJsonLd, s as detachSignature, t as InvalidContextReferenceError, u as isClearlyMalformedContextReference } from "./ld-CRF7lyrS.mjs";
11
- import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-CzyGUO2V.mjs";
12
- import { n as signObject, r as verifyObject } from "./proof-C5RSnFgT.mjs";
10
+ import { a as compactJsonLd, c as getNormalizationContextLoader, d as isInvalidUrlTypeError, f as signJsonLd, g as wrapContextLoaderForJsonLd, l as hasSignature, p as verifyCompactJsonLd, r as assertSafeJsonLd, s as detachSignature, t as InvalidContextReferenceError, u as isClearlyMalformedContextReference } from "./ld-uaq9Uc9i.mjs";
11
+ import { n as getKeyOwner, t as doesActorOwnKey } from "./owner-Ds5LSYBk.mjs";
12
+ import { n as signObject, r as verifyObject } from "./proof-2v-RNn_n.mjs";
13
13
  import { d as readBoundedText, l as BodyTooLargeError, t as getNodeInfo, u as MAX_BODY_SIZE } from "./client-BUqbea1d.mjs";
14
14
  import { t as nodeInfoToJson } from "./types-MNlFfxjv.mjs";
15
- import { n as routeActivity } from "./inbox-L_6BmE2i.mjs";
16
- import { t as FederationBuilderImpl } from "./builder-BcvxEZKX.mjs";
15
+ import { n as routeActivity } from "./inbox-CKKOBg0X.mjs";
16
+ import { t as FederationBuilderImpl } from "./builder-CcdhtqZA.mjs";
17
17
  import { t as buildCollectionSynchronizationHeader } from "./collection-DI6YzYpd.mjs";
18
18
  import { t as KvKeyCache } from "./keycache-D239uGT9.mjs";
19
19
  import { t as acceptsJsonLd } from "./negotiation-TWEs6Cl8.mjs";
20
- import { t as hasMalformedKnownTemporalLiteral } from "./temporal-BENj2PAS.mjs";
20
+ import { t as hasMalformedKnownTemporalLiteral } from "./temporal-BAJ8SH-_.mjs";
21
21
  import { t as createExponentialBackoffPolicy } from "./retry-Ddbq3AcK.mjs";
22
- import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send-GF-lyxJ8.mjs";
22
+ import { n as extractInboxes, r as sendActivity, t as SendActivityError } from "./send-Dvu09tKp.mjs";
23
23
  import { Activity, Collection, CollectionPage, CryptographicKey, Link, Multikey, Object as Object$1, OrderedCollection, OrderedCollectionPage, getTypeId, lookupObject, traverseCollection } from "@fedify/vocab";
24
24
  import { lookupWebFinger } from "@fedify/webfinger";
25
25
  import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
@@ -1,4 +1,4 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
- const require_middleware = require("./middleware-DCo4yvzF.cjs");
3
+ const require_middleware = require("./middleware-Bhbzx0XA.cjs");
4
4
  exports.FederationImpl = require_middleware.FederationImpl;
@@ -2,10 +2,10 @@ import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
3
  import { t as __exportAll } from "./chunk-CRNNMoPX.js";
4
4
  import { r as getDefaultActivityTransformers } from "./transformers-BGMIq1cs.js";
5
- import { c as importJwk, d as name, f as version, i as exportJwk, l as validateCryptoKey, r as verifyRequest, t as doubleKnock } from "./http-L83xbCXG.js";
5
+ import { c as importJwk, d as name, f as version, i as exportJwk, l as validateCryptoKey, r as verifyRequest, t as doubleKnock } from "./http-CBZxo485.js";
6
6
  import { a as MAX_BODY_SIZE, i as BodyTooLargeError, n as getNodeInfo, o as readBoundedText, t as nodeInfoToJson } from "./types-miAYfiGO.js";
7
- import { _ as signJsonLd, a as doesActorOwnKey, c as assertSafeJsonLd, f as detachSignature, g as isInvalidUrlTypeError, h as isClearlyMalformedContextReference, m as hasSignature, n as signObject, o as getKeyOwner, p as getNormalizationContextLoader, r as verifyObject, s as InvalidContextReferenceError, u as compactJsonLd, v as verifyCompactJsonLd, x as wrapContextLoaderForJsonLd } from "./proof-dnt7DNOm.js";
8
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-B4fx_uVi.js";
7
+ import { _ as signJsonLd, a as doesActorOwnKey, c as assertSafeJsonLd, f as detachSignature, g as isInvalidUrlTypeError, h as isClearlyMalformedContextReference, m as hasSignature, n as signObject, o as getKeyOwner, p as getNormalizationContextLoader, r as verifyObject, s as InvalidContextReferenceError, u as compactJsonLd, v as verifyCompactJsonLd, x as wrapContextLoaderForJsonLd } from "./proof-zSRThRNk.js";
8
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-OZi_bDmv.js";
9
9
  import { getLogger, withContext } from "@logtape/logtape";
10
10
  import { Activity, Collection, CollectionPage, CryptographicKey, Link, Multikey, Object as Object$1, OrderedCollection, OrderedCollectionPage, getTypeId, lookupObject, traverseCollection } from "@fedify/vocab";
11
11
  import { SpanKind, SpanStatusCode, context, propagation, trace } from "@opentelemetry/api";
package/dist/mod.cjs CHANGED
@@ -4,11 +4,11 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
4
  require("./chunk-DDcVe30Y.cjs");
5
5
  const require_transformers = require("./transformers-NeAONrAq.cjs");
6
6
  require("./compat/mod.cjs");
7
- const require_http = require("./http-DUhfTNYc.cjs");
8
- const require_middleware = require("./middleware-DCo4yvzF.cjs");
7
+ const require_http = require("./http-6cUjmZau.cjs");
8
+ const require_middleware = require("./middleware-Bhbzx0XA.cjs");
9
9
  const require_types = require("./types-DRPjmHVV.cjs");
10
- const require_proof = require("./proof-BXCmXpPp.cjs");
11
- const require_kv_cache = require("./kv-cache-Ctg7CnWG.cjs");
10
+ const require_proof = require("./proof-C5gSPzjd.cjs");
11
+ const require_kv_cache = require("./kv-cache-BV20L2x4.cjs");
12
12
  const require_federation_mod = require("./federation/mod.cjs");
13
13
  require("./nodeinfo/mod.cjs");
14
14
  require("./runtime/mod.cjs");
package/dist/mod.js CHANGED
@@ -3,11 +3,11 @@ import { URLPattern } from "urlpattern-polyfill";
3
3
  import "./chunk-CRNNMoPX.js";
4
4
  import { n as autoIdAssigner, r as getDefaultActivityTransformers, t as actorDehydrator } from "./transformers-BGMIq1cs.js";
5
5
  import "./compat/mod.js";
6
- import { c as importJwk, i as exportJwk, n as signRequest, o as fetchKey, r as verifyRequest, s as generateCryptoKeyPair } from "./http-L83xbCXG.js";
7
- import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as Router, f as RouterError, i as SendActivityError, l as digest, o as respondWithObject, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as createFederationBuilder } from "./middleware-BJ9bf3TC.js";
6
+ import { c as importJwk, i as exportJwk, n as signRequest, o as fetchKey, r as verifyRequest, s as generateCryptoKeyPair } from "./http-CBZxo485.js";
7
+ import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as Router, f as RouterError, i as SendActivityError, l as digest, o as respondWithObject, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as createFederationBuilder } from "./middleware-w_QMTb52.js";
8
8
  import { n as getNodeInfo, r as parseNodeInfo, t as nodeInfoToJson } from "./types-miAYfiGO.js";
9
- import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "./proof-dnt7DNOm.js";
10
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-B4fx_uVi.js";
9
+ import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "./proof-zSRThRNk.js";
10
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-OZi_bDmv.js";
11
11
  import { InProcessMessageQueue, MemoryKvStore, ParallelMessageQueue } from "./federation/mod.js";
12
12
  import "./nodeinfo/mod.js";
13
13
  import "./runtime/mod.js";
@@ -3,7 +3,7 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { t as esm_default } from "../esm-DVILvP5e.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
- import "../std__assert-Duiq_YC9.mjs";
6
+ import "../std__assert-BUOJXi-Z.mjs";
7
7
  import { n as assertInstanceOf } from "../assert-BhQd8QHP.mjs";
8
8
  import { a as parseProtocol, c as parseUsage, i as parseOutboundService, n as parseInboundService, o as parseServices, r as parseNodeInfo, s as parseSoftware, t as getNodeInfo } from "../client-BUqbea1d.mjs";
9
9
  import { test } from "@fedify/fixture";
@@ -3,9 +3,9 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { n as createRequestContext } from "../context-Juj6bdHC.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
- import "../std__assert-Duiq_YC9.mjs";
6
+ import "../std__assert-BUOJXi-Z.mjs";
7
7
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
8
- import { a as createFederation, h as handleNodeInfoJrd, m as handleNodeInfo } from "../middleware-k55i1cGt.mjs";
8
+ import { a as createFederation, h as handleNodeInfoJrd, m as handleNodeInfo } from "../middleware-D5XEd8l9.mjs";
9
9
  import { test } from "@fedify/fixture";
10
10
  //#region src/nodeinfo/handler.test.ts
11
11
  test("handleNodeInfo()", async () => {
@@ -2,7 +2,7 @@ import "@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 "../std__assert-Duiq_YC9.mjs";
5
+ import "../std__assert-BUOJXi-Z.mjs";
6
6
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
7
7
  import { t as nodeInfoToJson } from "../types-MNlFfxjv.mjs";
8
8
  import { test } from "@fedify/fixture";
@@ -2,7 +2,7 @@ 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 "../std__assert-Duiq_YC9.mjs";
5
+ import "../std__assert-BUOJXi-Z.mjs";
6
6
  import { t as MemoryKvStore } from "../kv-mI4Ix2EU.mjs";
7
7
  import { test } from "@fedify/fixture";
8
8
  import { SpanKind, SpanStatusCode, TraceFlags } from "@opentelemetry/api";
@@ -1,8 +1,8 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-Cmv-pCm8.mjs";
5
- import { n as fetchActorDocument, s as verifyKeyOwnership, t as exportJwk } from "./key-DPJmeIuq.mjs";
4
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
5
+ import { n as fetchActorDocument, s as verifyKeyOwnership, t as exportJwk } from "./key-BMxcDQ7Z.mjs";
6
6
  import { CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
7
7
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
8
8
  import { getDocumentLoader } from "@fedify/vocab-runtime";
@@ -1,8 +1,8 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-Cmv-pCm8.mjs";
5
- import { o as validateCryptoKey, r as fetchKey } from "./key-DPJmeIuq.mjs";
4
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
5
+ import { o as validateCryptoKey, r as fetchKey } from "./key-BMxcDQ7Z.mjs";
6
6
  import { Activity, DataIntegrityProof, Multikey, getTypeId } from "@fedify/vocab";
7
7
  import { SpanStatusCode, trace } from "@opentelemetry/api";
8
8
  import { getLogger } from "@logtape/logtape";
@@ -1,7 +1,7 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  const require_chunk = require("./chunk-DDcVe30Y.cjs");
4
- const require_http = require("./http-DUhfTNYc.cjs");
4
+ const require_http = require("./http-6cUjmZau.cjs");
5
5
  let _logtape_logtape = require("@logtape/logtape");
6
6
  let _fedify_vocab = require("@fedify/vocab");
7
7
  let _opentelemetry_api = require("@opentelemetry/api");
@@ -205,7 +205,7 @@ function normalizeContextReference(reference, baseUrl) {
205
205
  /** @internal */
206
206
  function isInvalidUrlTypeError(error) {
207
207
  const code = error.code;
208
- return error instanceof TypeError && (code === "ERR_INVALID_URL" || /^Invalid URL(?::|$)/.test(error.message) || / cannot be parsed as a URL\.?$/.test(error.message));
208
+ return error instanceof TypeError && (code === "ERR_INVALID_URL" || error.message === "Invalid URL string." || /^Invalid URL(?::|$)/.test(error.message) || / cannot be parsed as a URL\.?$/.test(error.message));
209
209
  }
210
210
  async function applyGraphAliasContext(state, context, documentLoader, remoteContextCache, baseUrl = null, processingContexts = /* @__PURE__ */ new Set()) {
211
211
  if (context === null) return createGraphAliasContextState();
@@ -1,6 +1,6 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { a as fetchActorDocument, d as name, f as version, i as exportJwk, l as validateCryptoKey, o as fetchKey, u as verifyKeyOwnership } from "./http-L83xbCXG.js";
3
+ import { a as fetchActorDocument, d as name, f as version, i as exportJwk, l as validateCryptoKey, o as fetchKey, u as verifyKeyOwnership } from "./http-CBZxo485.js";
4
4
  import { getLogger } from "@logtape/logtape";
5
5
  import { Activity, CryptographicKey, DataIntegrityProof, Multikey, Object as Object$1, getTypeId, isActor } from "@fedify/vocab";
6
6
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
@@ -202,7 +202,7 @@ function normalizeContextReference(reference, baseUrl) {
202
202
  /** @internal */
203
203
  function isInvalidUrlTypeError(error) {
204
204
  const code = error.code;
205
- return error instanceof TypeError && (code === "ERR_INVALID_URL" || /^Invalid URL(?::|$)/.test(error.message) || / cannot be parsed as a URL\.?$/.test(error.message));
205
+ return error instanceof TypeError && (code === "ERR_INVALID_URL" || error.message === "Invalid URL string." || /^Invalid URL(?::|$)/.test(error.message) || / cannot be parsed as a URL\.?$/.test(error.message));
206
206
  }
207
207
  async function applyGraphAliasContext(state, context, documentLoader, remoteContextCache, baseUrl = null, processingContexts = /* @__PURE__ */ new Set()) {
208
208
  if (context === null) return createGraphAliasContextState();
@@ -1,8 +1,8 @@
1
1
  import "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { n as version, t as name } from "./deno-Cmv-pCm8.mjs";
5
- import { n as doubleKnock } from "./http-BO446axb.mjs";
4
+ import { n as version, t as name } from "./deno-t1Hq3o4g.mjs";
5
+ import { n as doubleKnock } from "./http-DscVc8UW.mjs";
6
6
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
7
7
  import { FetchError, UrlError, validatePublicUrl } from "@fedify/vocab-runtime";
8
8
  import { getLogger } from "@logtape/logtape";
@@ -3,12 +3,12 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { t as esm_default } from "../esm-DVILvP5e.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
- import { a as assertExists, t as assertStringIncludes } from "../std__assert-Duiq_YC9.mjs";
6
+ import { i as assertExists, t as assertStringIncludes } from "../std__assert-BUOJXi-Z.mjs";
7
7
  import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
8
8
  import { t as assert } from "../assert-BhQd8QHP.mjs";
9
9
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
10
- import { t as exportJwk } from "../key-DPJmeIuq.mjs";
11
- import { a as parseRfc9421Signature, c as timingSafeEqual, i as formatRfc9421SignatureParameters, l as verifyRequest, n as doubleKnock, o as parseRfc9421SignatureInput, r as formatRfc9421Signature, s as signRequest, t as createRfc9421SignatureBase } from "../http-BO446axb.mjs";
10
+ import { t as exportJwk } from "../key-BMxcDQ7Z.mjs";
11
+ import { a as parseRfc9421Signature, c as timingSafeEqual, i as formatRfc9421SignatureParameters, l as verifyRequest, n as doubleKnock, o as parseRfc9421SignatureInput, r as formatRfc9421Signature, s as signRequest, t as createRfc9421SignatureBase } from "../http-DscVc8UW.mjs";
12
12
  import { i as rsaPrivateKey2, l as rsaPublicKey5, o as rsaPublicKey1, s as rsaPublicKey2 } from "../keys-CCxRJhWa.mjs";
13
13
  import { mockDocumentLoader, test } from "@fedify/fixture";
14
14
  import { FetchError, exportSpki } from "@fedify/vocab-runtime";
@@ -307,6 +307,46 @@ test("verifyRequest() [rfc9421] successful GET verification", async () => {
307
307
  currentTime: Temporal.Instant.from(`${(/* @__PURE__ */ new Date(currentTimestamp * 1e3)).toISOString()}`)
308
308
  }), rsaPublicKey2, "Valid signature should verify to the correct public key");
309
309
  });
310
+ for (const failure of [
311
+ "missing key",
312
+ "invalid signature",
313
+ "digest mismatch",
314
+ "empty body",
315
+ "cached key"
316
+ ]) test(`verifyRequest() [rfc9421] multiple POST signatures: ${failure}`, async () => {
317
+ const body = failure === "empty body" ? "" : "Hello, world!";
318
+ const currentTime = Temporal.Instant.from("2024-03-05T08:09:44Z");
319
+ const signed = await signRequest(new Request("https://example.com/inbox", {
320
+ method: "POST",
321
+ body
322
+ }), rsaPrivateKey2, new URL("https://example.com/key2"), {
323
+ spec: "rfc9421",
324
+ currentTime
325
+ });
326
+ const input = signed.headers.get("Signature-Input");
327
+ const signature = signed.headers.get("Signature");
328
+ const firstInput = failure === "missing key" ? input.replace("https://example.com/key2", "https://example.com/missing-key") : input;
329
+ signed.headers.set("Signature-Input", `${firstInput}, ${input.replace(/^sig1=/, "sig2=")}`);
330
+ signed.headers.set("Signature", `sig1=:AAAAAA==:, ${signature.replace(/^sig1=/, "sig2=")}`);
331
+ const request = failure === "digest mismatch" ? new Request(signed, { body: "Tampered body" }) : signed;
332
+ const loaded = [];
333
+ assertEquals(await verifyRequest(request, {
334
+ keyCache: failure === "cached key" ? {
335
+ get: () => Promise.resolve(rsaPublicKey1),
336
+ set: async () => {}
337
+ } : void 0,
338
+ spec: "rfc9421",
339
+ currentTime,
340
+ contextLoader: mockDocumentLoader,
341
+ documentLoader: (url, options) => {
342
+ loaded.push(url);
343
+ return mockDocumentLoader(url, options);
344
+ }
345
+ }), failure === "digest mismatch" ? null : rsaPublicKey2);
346
+ assertEquals(loaded, failure === "digest mismatch" ? [] : failure === "missing key" ? ["https://example.com/missing-key", "https://example.com/key2"] : ["https://example.com/key2", "https://example.com/key2"]);
347
+ assertFalse(request.bodyUsed);
348
+ assertEquals(await request.text(), failure === "digest mismatch" ? "Tampered body" : body);
349
+ });
310
350
  test("verifyRequest() [rfc9421] manual POST verification", async () => {
311
351
  const currentTimestamp = 1709626184;
312
352
  const currentTime = Temporal.Instant.from("2024-03-05T08:09:44Z");
@@ -2,11 +2,11 @@ import "@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 "../std__assert-Duiq_YC9.mjs";
5
+ import "../std__assert-BUOJXi-Z.mjs";
6
6
  import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
7
7
  import { t as assert } from "../assert-BhQd8QHP.mjs";
8
8
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
9
- import { a as importJwk, i as generateCryptoKeyPair, o as validateCryptoKey, r as fetchKey, t as exportJwk } from "../key-DPJmeIuq.mjs";
9
+ import { a as importJwk, i as generateCryptoKeyPair, o as validateCryptoKey, r as fetchKey, t as exportJwk } from "../key-BMxcDQ7Z.mjs";
10
10
  import { c as rsaPublicKey3, i as rsaPrivateKey2, o as rsaPublicKey1, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
11
11
  import { mockDocumentLoader, test } from "@fedify/fixture";
12
12
  import { CryptographicKey, Multikey } from "@fedify/vocab";
@@ -5,14 +5,17 @@ import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
5
5
  import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
6
6
  import { n as assertInstanceOf, t as assert } from "../assert-BhQd8QHP.mjs";
7
7
  import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
8
- import { i as generateCryptoKeyPair } from "../key-DPJmeIuq.mjs";
8
+ import { i as generateCryptoKeyPair } from "../key-BMxcDQ7Z.mjs";
9
9
  import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
10
- import { a as compactJsonLd, d as isInvalidUrlTypeError, f as signJsonLd, h as verifySignature, i as attachSignature, m as verifyJsonLd, n as UnsafeJsonLdError, o as createSignature, s as detachSignature } from "../ld-CRF7lyrS.mjs";
10
+ import { a as compactJsonLd, d as isInvalidUrlTypeError, f as signJsonLd, h as verifySignature, i as attachSignature, m as verifyJsonLd, n as UnsafeJsonLdError, o as createSignature, s as detachSignature } from "../ld-uaq9Uc9i.mjs";
11
11
  import { mockDocumentLoader, test } from "@fedify/fixture";
12
12
  import { CryptographicKey } from "@fedify/vocab";
13
13
  import { encodeBase64 } from "byte-encodings/base64";
14
14
  //#region src/sig/ld.test.ts
15
15
  test("isInvalidUrlTypeError()", () => {
16
+ assert(isInvalidUrlTypeError(/* @__PURE__ */ new TypeError("Invalid URL string.")));
17
+ assertFalse(isInvalidUrlTypeError(/* @__PURE__ */ new Error("Invalid URL string.")));
18
+ assertFalse(isInvalidUrlTypeError(/* @__PURE__ */ new TypeError("Invalid URL string. Other error")));
16
19
  assert(isInvalidUrlTypeError(/* @__PURE__ */ new TypeError("Invalid URL: http://[")));
17
20
  assert(isInvalidUrlTypeError(/* @__PURE__ */ new TypeError("\"http://[\" cannot be parsed as a URL.")));
18
21
  const error = /* @__PURE__ */ new TypeError("Failed to parse URL");
package/dist/sig/mod.cjs CHANGED
@@ -1,8 +1,8 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
- const require_http = require("../http-DUhfTNYc.cjs");
5
- const require_proof = require("../proof-BXCmXpPp.cjs");
4
+ const require_http = require("../http-6cUjmZau.cjs");
5
+ const require_proof = require("../proof-C5gSPzjd.cjs");
6
6
  exports.attachSignature = require_proof.attachSignature;
7
7
  exports.createProof = require_proof.createProof;
8
8
  exports.createSignature = require_proof.createSignature;
package/dist/sig/mod.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { c as importJwk, i as exportJwk, n as signRequest, o as fetchKey, r as verifyRequest, s as generateCryptoKeyPair } from "../http-L83xbCXG.js";
4
- import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "../proof-dnt7DNOm.js";
3
+ import { c as importJwk, i as exportJwk, n as signRequest, o as fetchKey, r as verifyRequest, s as generateCryptoKeyPair } from "../http-CBZxo485.js";
4
+ import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "../proof-zSRThRNk.js";
5
5
  export { attachSignature, createProof, createSignature, detachSignature, doesActorOwnKey, exportJwk, fetchKey, generateCryptoKeyPair, getKeyOwner, importJwk, signJsonLd, signObject, signRequest, verifyJsonLd, verifyObject, verifyProof, verifyRequest, verifySignature };
@@ -2,11 +2,11 @@ import "@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 "../std__assert-Duiq_YC9.mjs";
5
+ import "../std__assert-BUOJXi-Z.mjs";
6
6
  import { n as assertFalse } from "../assert_rejects-B-qJtC9Z.mjs";
7
7
  import { t as assert } from "../assert-BhQd8QHP.mjs";
8
8
  import { o as rsaPublicKey1, s as rsaPublicKey2 } from "../keys-CCxRJhWa.mjs";
9
- import { n as getKeyOwner, t as doesActorOwnKey } from "../owner-CzyGUO2V.mjs";
9
+ import { n as getKeyOwner, t as doesActorOwnKey } from "../owner-Ds5LSYBk.mjs";
10
10
  import { createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
11
11
  import { Create, CryptographicKey, lookupObject } from "@fedify/vocab";
12
12
  //#region src/sig/owner.test.ts
@@ -2,11 +2,11 @@ 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 "../std__assert-Duiq_YC9.mjs";
5
+ import "../std__assert-BUOJXi-Z.mjs";
6
6
  import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
7
7
  import { n as assertInstanceOf } from "../assert-BhQd8QHP.mjs";
8
8
  import { i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CCxRJhWa.mjs";
9
- import { i as verifyProof, n as signObject, r as verifyObject, t as createProof } from "../proof-C5RSnFgT.mjs";
9
+ import { i as verifyProof, n as signObject, r as verifyObject, t as createProof } from "../proof-2v-RNn_n.mjs";
10
10
  import { mockDocumentLoader, test } from "@fedify/fixture";
11
11
  import { Create, DataIntegrityProof, Multikey, Note, Place } from "@fedify/vocab";
12
12
  import { decodeMultibase, importMultibaseKey } from "@fedify/vocab-runtime";
@@ -52,31 +52,6 @@ import "./assert_throws-4NwKEy2q.mjs";
52
52
  throw new AssertionError(msg ?? `Expect ${actualString} >= ${expectedString}`);
53
53
  }
54
54
  //#endregion
55
- //#region ../../node_modules/.pnpm/@jsr+std__assert@0.226.0/node_modules/@jsr/std__assert/assert_greater.js
56
- /**
57
- * Make an assertion that `actual` is greater than `expected`.
58
- * If not then throw.
59
- *
60
- * @example Usage
61
- * ```ts no-eval
62
- * import { assertGreater } from "@std/assert/assert-greater";
63
- *
64
- * assertGreater(2, 1); // Doesn't throw
65
- * assertGreater(1, 1); // Throws
66
- * assertGreater(0, 1); // Throws
67
- * ```
68
- *
69
- * @typeParam T The type of the values to compare.
70
- * @param actual The actual value to compare.
71
- * @param expected The expected value to compare.
72
- * @param msg The optional message to display if the assertion fails.
73
- */ function assertGreater(actual, expected, msg) {
74
- if (actual > expected) return;
75
- const actualString = format(actual);
76
- const expectedString = format(expected);
77
- throw new AssertionError(msg ?? `Expect ${actualString} > ${expectedString}`);
78
- }
79
- //#endregion
80
55
  //#region ../../node_modules/.pnpm/@jsr+std__assert@0.226.0/node_modules/@jsr/std__assert/assert_strict_equals.js
81
56
  /**
82
57
  * Make an assertion that `actual` and `expected` are equal using
@@ -136,4 +111,4 @@ import "./assert_throws-4NwKEy2q.mjs";
136
111
  }
137
112
  }
138
113
  //#endregion
139
- export { assertExists as a, assertGreaterOrEqual as i, assertStrictEquals as n, assertGreater as r, assertStringIncludes as t };
114
+ export { assertExists as i, assertStrictEquals as n, assertGreaterOrEqual as r, assertStringIncludes as t };
@@ -1,7 +1,7 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
- import { c as getNormalizationContextLoader } from "./ld-CRF7lyrS.mjs";
4
+ import { c as getNormalizationContextLoader } from "./ld-uaq9Uc9i.mjs";
5
5
  import jsonld from "@fedify/vocab-runtime/jsonld";
6
6
  //#region src/federation/temporal.ts
7
7
  function isPlainObject(value) {
@@ -3,11 +3,11 @@ import "urlpattern-polyfill";
3
3
  globalThis.addEventListener = () => {};
4
4
  import { t as esm_default } from "../esm-DVILvP5e.mjs";
5
5
  import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
6
- import "../std__assert-Duiq_YC9.mjs";
6
+ import "../std__assert-BUOJXi-Z.mjs";
7
7
  import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
8
- import { l as verifyRequest } from "../http-BO446axb.mjs";
8
+ import { l as verifyRequest } from "../http-DscVc8UW.mjs";
9
9
  import { i as rsaPrivateKey2 } from "../keys-CCxRJhWa.mjs";
10
- import { t as getAuthenticatedDocumentLoader } from "../docloader-D4yRGK7K.mjs";
10
+ import { t as getAuthenticatedDocumentLoader } from "../docloader-DmksBzVa.mjs";
11
11
  import { mockDocumentLoader, test } from "@fedify/fixture";
12
12
  import { FetchError, UrlError } from "@fedify/vocab-runtime";
13
13
  import { configure, reset } from "@logtape/logtape";
@@ -1,6 +1,6 @@
1
1
  const { Temporal } = require("@js-temporal/polyfill");
2
2
  const { URLPattern } = require("urlpattern-polyfill");
3
3
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
4
- const require_kv_cache = require("../kv-cache-Ctg7CnWG.cjs");
4
+ const require_kv_cache = require("../kv-cache-BV20L2x4.cjs");
5
5
  exports.getAuthenticatedDocumentLoader = require_kv_cache.getAuthenticatedDocumentLoader;
6
6
  exports.kvCache = require_kv_cache.kvCache;
package/dist/utils/mod.js CHANGED
@@ -1,4 +1,4 @@
1
1
  import { Temporal } from "@js-temporal/polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { n as getAuthenticatedDocumentLoader, t as kvCache } from "../kv-cache-B4fx_uVi.js";
3
+ import { n as getAuthenticatedDocumentLoader, t as kvCache } from "../kv-cache-OZi_bDmv.js";
4
4
  export { getAuthenticatedDocumentLoader, kvCache };
@@ -5,7 +5,7 @@ import { createRequire } from "node:module";
5
5
  import { test } from "@fedify/fixture";
6
6
  import { strictEqual } from "node:assert";
7
7
  //#region src/vocab/cjs.test.ts
8
- test("CommonJS vocab entry exports Object", { ignore: "Deno" in globalThis }, () => {
8
+ test("CommonJS vocab entry exports Object", { ignore: "Deno" in globalThis || "navigator" in globalThis && navigator.userAgent === "Cloudflare-Workers" }, () => {
9
9
  const vocab = createRequire(import.meta.url)("./mod.cjs");
10
10
  strictEqual(typeof vocab.Object, "function");
11
11
  strictEqual(typeof vocab.Update, "function");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/fedify",
3
- "version": "2.0.29-dev.2096+a1659cb1",
3
+ "version": "2.0.29-dev.2121+c46fb9dd",
4
4
  "description": "An ActivityPub server framework",
5
5
  "keywords": [
6
6
  "ActivityPub",
@@ -144,9 +144,9 @@
144
144
  "uri-template-router": "^1.0.0",
145
145
  "url-template": "^3.1.1",
146
146
  "urlpattern-polyfill": "^10.1.0",
147
- "@fedify/vocab-runtime": "2.0.29-dev.2096+a1659cb1",
148
- "@fedify/webfinger": "2.0.29-dev.2096+a1659cb1",
149
- "@fedify/vocab": "2.0.29-dev.2096+a1659cb1"
147
+ "@fedify/vocab-runtime": "2.0.29-dev.2121+c46fb9dd",
148
+ "@fedify/vocab": "2.0.29-dev.2121+c46fb9dd",
149
+ "@fedify/webfinger": "2.0.29-dev.2121+c46fb9dd"
150
150
  },
151
151
  "devDependencies": {
152
152
  "@std/assert": "npm:@jsr/std__assert@^0.226.0",
@@ -158,8 +158,8 @@
158
158
  "tsx": "^4.19.4",
159
159
  "typescript": "^6.0.0",
160
160
  "wrangler": "^4.17.0",
161
- "@fedify/vocab-tools": "^2.0.29-dev.2096+a1659cb1",
162
- "@fedify/fixture": "2.0.0"
161
+ "@fedify/fixture": "2.0.0",
162
+ "@fedify/vocab-tools": "^2.0.29-dev.2121+c46fb9dd"
163
163
  },
164
164
  "scripts": {
165
165
  "build:self": "tsdown",
@@ -169,6 +169,6 @@
169
169
  "test": "cd dist/ && node --test",
170
170
  "pretest:bun": "pnpm build",
171
171
  "test:bun": "cd dist/ && bun test --timeout 60000",
172
- "test:cfworkers": "deno task codegen && wrangler deploy --dry-run --outdir src/cfworkers && node --import=tsx src/cfworkers/client.ts"
172
+ "test:cfworkers": "deno task codegen && wrangler deploy --dry-run --outdir src/cfworkers && node --import=tsx scripts/check_cfworkers.ts && node --import=tsx src/cfworkers/client.ts"
173
173
  }
174
174
  }