@fedify/fedify 2.4.0-dev.2256 → 2.4.0-dev.2260

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 (105) hide show
  1. package/dist/{builder-DvSQqk2l.mjs → builder-BK8HfSUm.mjs} +8 -2
  2. package/dist/compat/mod.d.cts +1 -1
  3. package/dist/compat/mod.d.ts +1 -1
  4. package/dist/compat/transformers.test.mjs +1 -1
  5. package/dist/{compound-proof-5bg_j_ye.mjs → compound-proof-D--HeIbV.mjs} +41 -4
  6. package/dist/{context-CtI307_A.d.ts → context-7NyiqIcg.d.ts} +111 -2
  7. package/dist/{context-B6X-t8gI.d.cts → context-tsYPJ2Ew.d.cts} +111 -2
  8. package/dist/{deno-AmcRMq5z.mjs → deno-DVP7DGJC.mjs} +1 -1
  9. package/dist/{docloader-CIP_SG39.mjs → docloader-Dv1JJl37.mjs} +2 -2
  10. package/dist/federation/builder.test.mjs +1 -1
  11. package/dist/federation/compound-fanout.test.mjs +3 -3
  12. package/dist/federation/handler-compound-proof.test.mjs +3 -3
  13. package/dist/federation/handler.test.mjs +76 -5
  14. package/dist/federation/hashlink-media.test.mjs +2 -2
  15. package/dist/federation/idempotency.test.mjs +2 -2
  16. package/dist/federation/inbox-report.test.d.mts +2 -0
  17. package/dist/federation/inbox-report.test.mjs +475 -0
  18. package/dist/federation/metrics.test.mjs +1 -1
  19. package/dist/federation/middleware.test.mjs +7 -7
  20. package/dist/federation/mod.cjs +1 -1
  21. package/dist/federation/mod.d.cts +4 -3
  22. package/dist/federation/mod.d.ts +4 -3
  23. package/dist/federation/mod.js +1 -1
  24. package/dist/federation/outgoing-proof.test.mjs +54 -10
  25. package/dist/federation/portable-actor.test.mjs +3 -3
  26. package/dist/federation/portable-chain.test.mjs +3 -3
  27. package/dist/federation/portable-collection.test.mjs +66 -4
  28. package/dist/federation/portable-delivery.test.mjs +2 -2
  29. package/dist/federation/portable-gateway-keys.test.mjs +4 -4
  30. package/dist/federation/portable-inbox.test.mjs +67 -6
  31. package/dist/federation/portable-parse-uri.test.mjs +1 -1
  32. package/dist/federation/portable-route-activity.test.mjs +2 -2
  33. package/dist/federation/portable.test.mjs +3 -3
  34. package/dist/federation/send.test.mjs +3 -3
  35. package/dist/federation/tasks/enqueue.test.mjs +1 -1
  36. package/dist/federation/tasks/tasks.test.mjs +2 -2
  37. package/dist/federation/temporal.test.mjs +1 -1
  38. package/dist/federation/webfinger.test.mjs +1 -1
  39. package/dist/{federation-BDzIgqOd.cjs → federation-Bo5z395X.cjs} +552 -122
  40. package/dist/{http-1fZ83jj7.cjs → http-BIhWdDf5.cjs} +447 -110
  41. package/dist/{http-BGb3QioZ.js → http-DRMu1C2T.js} +430 -111
  42. package/dist/{http-DkqWu-sm.mjs → http-DvpuyDJB.mjs} +141 -98
  43. package/dist/{key-CEsu7oaD.mjs → key-B7N8mNoY.mjs} +30 -3
  44. package/dist/{http-BrwKINQn.d.cts → key-C1nv7_jD.d.ts} +638 -229
  45. package/dist/{http-DGx0KOws.d.ts → key-DYxuyd-s.d.cts} +638 -229
  46. package/dist/{kv-cache-CJS4mImS.mjs → kv-cache-D0kA0rml.mjs} +1 -1
  47. package/dist/{kv-cache-CGhEgt98.js → kv-cache-DZLpqhW9.js} +1 -1
  48. package/dist/{kv-cache-BEWuZSB4.cjs → kv-cache-mF8Zmjix.cjs} +1 -1
  49. package/dist/{ld-Cf4CPWN_.mjs → ld-BDMNyM2M.mjs} +40 -5
  50. package/dist/{metrics-CocsZP0E.mjs → metrics-BbBj-VZN.mjs} +2 -1
  51. package/dist/{middleware-Cne_jMZo.mjs → middleware-CE1X7-UM.mjs} +1 -1
  52. package/dist/{middleware-Dxn0E9ES.mjs → middleware-DAA7wDdS.mjs} +520 -131
  53. package/dist/{middleware-BfYke3YQ.js → middleware-DfUWPAa-.js} +552 -122
  54. package/dist/{mod-C7_2j7VT.d.cts → mod-BojP2Bw3.d.cts} +1 -1
  55. package/dist/{mod-BlLwewYe.d.ts → mod-CavhAgLw.d.cts} +5 -255
  56. package/dist/{mod-VHYh1lTK.d.cts → mod-CtpF2BU5.d.ts} +5 -255
  57. package/dist/{mod-B8MI1mpi.d.ts → mod-DEZXwV6J.d.ts} +1 -1
  58. package/dist/{mod-DFL6IxYQ.d.cts → mod-Dw-nPxQh.d.cts} +1 -1
  59. package/dist/{mod-BhTaDR5H.d.ts → mod-Xj5P4s4d.d.ts} +1 -1
  60. package/dist/mod.cjs +4 -4
  61. package/dist/mod.d.cts +7 -7
  62. package/dist/mod.d.ts +7 -7
  63. package/dist/mod.js +4 -4
  64. package/dist/nodeinfo/handler.test.mjs +1 -1
  65. package/dist/{owner-DSJ7nFgy.mjs → owner-CzUycuhd.mjs} +3 -3
  66. package/dist/{portable-collection-BuBV6xTo.js → portable-collection-COcJxZg_.js} +1 -1
  67. package/dist/{portable-collection-qskqXJrH.mjs → portable-collection-CTcNJiAa.mjs} +2 -2
  68. package/dist/{portable-collection-r-mHg1PV.cjs → portable-collection-cPMffcHJ.cjs} +1 -1
  69. package/dist/{portable-key-woGH_1nn.mjs → portable-key-B4QN3OzR.mjs} +1 -1
  70. package/dist/{proof-8WiH_-Gq.mjs → proof-nce4pf5S.mjs} +133 -16
  71. package/dist/{send-JKzZBgPU.mjs → send-4Idpe2z0.mjs} +3 -3
  72. package/dist/sig/compound-proof-discovery.test.mjs +1 -1
  73. package/dist/sig/compound-proof-producer.test.mjs +1 -1
  74. package/dist/sig/compound-proof-verification.test.mjs +19 -2
  75. package/dist/sig/compound-proof.test.mjs +2 -2
  76. package/dist/sig/http.test.mjs +2 -2
  77. package/dist/sig/key.test.mjs +1 -1
  78. package/dist/sig/ld.test.mjs +2 -2
  79. package/dist/sig/mitra-receive-interop.test.mjs +4 -4
  80. package/dist/sig/mitra-send-interop.test.mjs +3 -3
  81. package/dist/sig/mod.cjs +2 -2
  82. package/dist/sig/mod.d.cts +2 -2
  83. package/dist/sig/mod.d.ts +2 -2
  84. package/dist/sig/mod.js +2 -2
  85. package/dist/sig/owner.test.mjs +1 -1
  86. package/dist/sig/portable-collection.test.mjs +1 -1
  87. package/dist/sig/portable-interop.test.mjs +3 -3
  88. package/dist/sig/portable-key.test.mjs +6 -6
  89. package/dist/sig/proof.test.mjs +76 -3
  90. package/dist/sig/tootik-request-interop.test.mjs +4 -4
  91. package/dist/sig/tootik-send-interop.test.mjs +3 -3
  92. package/dist/sig/verification.test.d.mts +2 -0
  93. package/dist/sig/verification.test.mjs +310 -0
  94. package/dist/{temporal-CT3fRaMH.mjs → temporal-BbjmPHYn.mjs} +1 -1
  95. package/dist/testing/kv.test.mjs +1 -1
  96. package/dist/testing/mod.d.mts +315 -28
  97. package/dist/utils/docloader.test.mjs +2 -2
  98. package/dist/utils/kv-cache.test.mjs +1 -1
  99. package/dist/utils/mod.cjs +1 -1
  100. package/dist/utils/mod.d.cts +1 -1
  101. package/dist/utils/mod.d.ts +1 -1
  102. package/dist/utils/mod.js +1 -1
  103. package/dist/verification-C3954hQh.mjs +5 -0
  104. package/dist/verification-Dpfcw8ml.mjs +105 -0
  105. package/package.json +7 -7
@@ -0,0 +1,475 @@
1
+ import "temporal-polyfill";
2
+ import "urlpattern-polyfill";
3
+ globalThis.addEventListener = () => {};
4
+ import { t as MemoryKvStore } from "../kv-DCHkaJ9-.mjs";
5
+ import { p as signJsonLd } from "../ld-BDMNyM2M.mjs";
6
+ import { a as signObject } from "../proof-nce4pf5S.mjs";
7
+ import { l as signRequest } from "../http-DvpuyDJB.mjs";
8
+ import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-DIJNHW-Y.mjs";
9
+ import { o as createFederation } from "../middleware-DAA7wDdS.mjs";
10
+ import { r as createFederationBuilder } from "../builder-BK8HfSUm.mjs";
11
+ import { Create, Person } from "@fedify/vocab";
12
+ import { exportDidKey, parseIri } from "@fedify/vocab-runtime";
13
+ import { mockDocumentLoader, test } from "@fedify/fixture";
14
+ import { deepStrictEqual, ok, rejects, strictEqual } from "node:assert/strict";
15
+ //#region src/federation/inbox-report.test.ts
16
+ const loaders = {
17
+ documentLoader: mockDocumentLoader,
18
+ contextLoader: mockDocumentLoader
19
+ };
20
+ function setup(skipSignatureVerification = false) {
21
+ const reports = [];
22
+ const federation = createFederation({
23
+ kv: new MemoryKvStore(),
24
+ skipSignatureVerification,
25
+ documentLoaderFactory: () => mockDocumentLoader,
26
+ contextLoaderFactory: () => mockDocumentLoader
27
+ });
28
+ federation.setActorDispatcher("/users/{identifier}", (_ctx, id) => id === "missing" ? null : new Person({})).setKeyPairsDispatcher(() => []);
29
+ return {
30
+ federation,
31
+ setters: federation.setInboxListeners("/users/{identifier}/inbox", "/inbox").onRequestFinished((_ctx, report) => {
32
+ reports.push(report);
33
+ }),
34
+ reports
35
+ };
36
+ }
37
+ async function payload(id = "https://example.com/create", actor = "https://example.com/person2") {
38
+ return await new Create({
39
+ id: new URL(id),
40
+ actor: new URL(actor)
41
+ }).toJsonLd(loaders);
42
+ }
43
+ function request(body, path = "/inbox") {
44
+ return new Request(`https://example.com${path}`, {
45
+ method: "POST",
46
+ body: JSON.stringify(body),
47
+ headers: { "Content-Type": "application/activity+json" }
48
+ });
49
+ }
50
+ test("onRequestFinished classifies early rejection, JSON null, and excluded routes", async () => {
51
+ const { federation, reports } = setup(true);
52
+ strictEqual((await federation.fetch(request({}, "/users/missing/inbox"), { contextData: void 0 })).status, 404);
53
+ deepStrictEqual(reports[0].inbox, {
54
+ kind: "personal",
55
+ recipient: "missing"
56
+ });
57
+ deepStrictEqual(reports[0].payload, { status: "unavailable" });
58
+ deepStrictEqual(reports[0].authentication, { status: "notDetermined" });
59
+ deepStrictEqual(reports[0].outcome, {
60
+ type: "response",
61
+ status: 404,
62
+ disposition: "rejected",
63
+ reason: "recipientNotFound"
64
+ });
65
+ strictEqual((await federation.fetch(request(null), { contextData: void 0 })).status, 400);
66
+ deepStrictEqual(reports[1].payload, {
67
+ status: "parsed",
68
+ value: null
69
+ });
70
+ deepStrictEqual(reports[1].authentication, { status: "notDetermined" });
71
+ await federation.fetch(new Request("https://example.com/users/alice/inbox"), { contextData: void 0 });
72
+ await federation.fetch(request({}, "/unmatched"), { contextData: void 0 });
73
+ strictEqual(reports.length, 2);
74
+ await federation.fetch(new Request("https://example.com/inbox", {
75
+ method: "POST",
76
+ body: "{"
77
+ }), { contextData: void 0 });
78
+ deepStrictEqual(reports[2].outcome, {
79
+ type: "response",
80
+ status: 400,
81
+ disposition: "rejected",
82
+ reason: "invalidJson"
83
+ });
84
+ });
85
+ test("onRequestFinished leaves deferred policy errors undetermined", async () => {
86
+ const did = await exportDidKey(ed25519Multikey.publicKey);
87
+ const keyId = parseIri(`${did}#${did.substring(8)}`);
88
+ const otherDid = await exportDidKey((await crypto.subtle.generateKey("Ed25519", true, ["sign", "verify"])).publicKey);
89
+ for (const withProof of [false, true]) {
90
+ const contextUrl = `https://example.com/context/deferred-${withProof}`;
91
+ const remote = {
92
+ contextUrl: null,
93
+ documentUrl: contextUrl,
94
+ document: { "@context": { ext: "https://example.com/ext" } }
95
+ };
96
+ const contextLoader = (url) => url === contextUrl ? Promise.resolve(remote) : mockDocumentLoader(url);
97
+ const activity = new Create({
98
+ id: parseIri(`ap+ef61://${withProof ? otherDid : did}/activities/deferred-${withProof}`),
99
+ actor: parseIri(`ap+ef61://${did}/users/bob`)
100
+ });
101
+ const context = [
102
+ "https://www.w3.org/ns/activitystreams",
103
+ "https://w3id.org/security/data-integrity/v1",
104
+ contextUrl
105
+ ];
106
+ const body = withProof ? await (await signObject(activity, ed25519PrivateKey, keyId, {
107
+ context,
108
+ contextLoader
109
+ })).toJsonLd({
110
+ format: "compact",
111
+ context,
112
+ contextLoader
113
+ }) : await activity.toJsonLd({
114
+ format: "compact",
115
+ context,
116
+ contextLoader
117
+ });
118
+ body.signature = {
119
+ type: "RsaSignature2017",
120
+ creator: rsaPublicKey3.id.href,
121
+ created: "2024-01-01T00:00:00Z",
122
+ signatureValue: "bogus"
123
+ };
124
+ let failOnce = true;
125
+ const reports = [];
126
+ const federation = createFederation({
127
+ kv: new MemoryKvStore(),
128
+ documentLoaderFactory: () => mockDocumentLoader,
129
+ contextLoaderFactory: () => async (url) => {
130
+ if (url === contextUrl && failOnce) {
131
+ failOnce = false;
132
+ throw new Error("Temporary context outage");
133
+ }
134
+ return await contextLoader(url);
135
+ }
136
+ });
137
+ federation.setActorDispatcher("/users/{identifier}", () => new Person({})).setKeyPairsDispatcher(() => []);
138
+ federation.setInboxListeners("/users/{identifier}/inbox", "/inbox").on(Create, () => {}).onRequestFinished((_ctx, report) => {
139
+ reports.push(report);
140
+ });
141
+ const signed = await signRequest(request(body), rsaPrivateKey3, rsaPublicKey3.id);
142
+ await rejects(federation.fetch(signed, { contextData: void 0 }), (error) => {
143
+ strictEqual(reports.length, 1);
144
+ deepStrictEqual(reports[0].authentication, { status: "notDetermined" });
145
+ ok(reports[0].outcome.type === "exception");
146
+ strictEqual(reports[0].outcome.stage, "policy");
147
+ strictEqual(reports[0].outcome.error, error);
148
+ return true;
149
+ });
150
+ strictEqual(reports[0].attempts.some((attempt) => attempt.mechanism === "objectIntegrity" && attempt.status === "verified"), withProof);
151
+ }
152
+ });
153
+ test("onRequestFinished awaits once and isolates observer failures", async () => {
154
+ const { federation, setters } = setup(true);
155
+ setters.on(Create, () => {});
156
+ let calls = 0;
157
+ let release;
158
+ const gate = new Promise((resolve) => {
159
+ release = resolve;
160
+ });
161
+ let entered;
162
+ const started = new Promise((resolve) => {
163
+ entered = resolve;
164
+ });
165
+ setters.onRequestFinished(async (_ctx, report) => {
166
+ calls++;
167
+ deepStrictEqual(report.authentication, { status: "skipped" });
168
+ strictEqual(report.outcome.type === "response" && report.outcome.disposition, "processed");
169
+ entered();
170
+ await gate;
171
+ throw new Error("observer failed");
172
+ });
173
+ let finished = false;
174
+ const response = federation.fetch(request(await payload()), { contextData: void 0 }).then((response) => {
175
+ finished = true;
176
+ return response;
177
+ });
178
+ await started;
179
+ strictEqual(finished, false);
180
+ release();
181
+ strictEqual((await response).status, 202);
182
+ strictEqual(calls, 1);
183
+ });
184
+ test("onRequestFinished preserves preparation exceptions and callback replacement", async () => {
185
+ const { federation, setters, reports } = setup();
186
+ const error = /* @__PURE__ */ new Error("preparation failed");
187
+ setters.setSharedKeyDispatcher(() => {
188
+ throw error;
189
+ });
190
+ setters.onRequestFinished((_ctx, report) => {
191
+ reports.push(report);
192
+ throw new Error("secondary failure");
193
+ });
194
+ await rejects(federation.fetch(request(await payload()), { contextData: void 0 }), (value) => value === error);
195
+ strictEqual(reports.length, 1);
196
+ deepStrictEqual(reports[0].outcome, {
197
+ type: "exception",
198
+ stage: "prepare",
199
+ error
200
+ });
201
+ deepStrictEqual(reports[0].authentication, { status: "notDetermined" });
202
+ });
203
+ test("onRequestFinished distinguishes custom responses from authentication", async () => {
204
+ const { federation, setters, reports } = setup();
205
+ setters.onUnverifiedActivity(() => new Response(null, { status: 202 }));
206
+ const body = await payload();
207
+ strictEqual((await federation.fetch(request(body), { contextData: void 0 })).status, 202);
208
+ deepStrictEqual(reports[0].authentication, {
209
+ status: "rejected",
210
+ reason: { type: "verificationFailed" }
211
+ });
212
+ deepStrictEqual(reports[0].outcome, {
213
+ type: "response",
214
+ status: 202,
215
+ disposition: "customResponse"
216
+ });
217
+ strictEqual(reports[0].attempts.at(-1)?.mechanism, "http");
218
+ setters.onUnverifiedActivity(() => {});
219
+ strictEqual((await federation.fetch(request(body), { contextData: void 0 })).status, 401);
220
+ strictEqual(reports[1].outcome.type === "response" && reports[1].outcome.disposition, "rejected");
221
+ });
222
+ test("onRequestFinished retains HTTP keys and separates ownership rejection", async () => {
223
+ const { federation, setters, reports } = setup();
224
+ setters.on(Create, () => {});
225
+ const signed = await signRequest(request(await payload()), rsaPrivateKey3, new URL("https://example.com/person2#key3"));
226
+ strictEqual((await federation.fetch(signed, { contextData: void 0 })).status, 202);
227
+ const report = reports[0];
228
+ strictEqual(report.authentication.status, "verified");
229
+ const attempt = report.attempts.find((attempt) => attempt.mechanism === "http");
230
+ ok(attempt?.status === "verified");
231
+ strictEqual(attempt.subject.id?.href, "https://example.com/create");
232
+ const check = attempt.checks[0];
233
+ ok(check.status === "verified" && check.key.type === "cryptographicKey");
234
+ strictEqual(check.key.publicKey.algorithm.name, "RSASSA-PKCS1-v1_5");
235
+ strictEqual(check.key.ownerId?.href, "https://example.com/person2");
236
+ strictEqual(check.key, check.triedKeys.at(-1));
237
+ strictEqual(attempt.signatures[0], check);
238
+ strictEqual(report.authentication.attempts[0], attempt);
239
+ await federation.fetch(signed, { contextData: void 0 });
240
+ deepStrictEqual(reports[1].outcome, {
241
+ type: "response",
242
+ status: 202,
243
+ disposition: "duplicate"
244
+ });
245
+ const mismatched = await signRequest(request(await payload("https://example.com/other", "https://example.com/person")), rsaPrivateKey3, new URL("https://example.com/person2#key3"));
246
+ strictEqual((await federation.fetch(mismatched, { contextData: void 0 })).status, 401);
247
+ strictEqual(reports[2].authentication.status, "rejected");
248
+ ok(reports[2].authentication.status === "rejected");
249
+ strictEqual(reports[2].authentication.reason.type, "actorKeyMismatch");
250
+ strictEqual(reports[2].attempts.at(-1)?.status, "verified");
251
+ });
252
+ test("onRequestFinished retains LDS crypto success before HTTP fallback", async () => {
253
+ const { federation, reports } = setup();
254
+ const signed = await signRequest(request(await signJsonLd(await payload("https://example.com/lds", "https://example.com/person"), rsaPrivateKey3, new URL("https://example.com/person2#key3"), loaders)), rsaPrivateKey2, new URL("https://example.com/key2"));
255
+ strictEqual((await federation.fetch(signed, { contextData: void 0 })).status, 202);
256
+ const ld = reports[0].attempts.find((attempt) => attempt.mechanism === "linkedData");
257
+ ok(ld?.status === "rejected");
258
+ strictEqual(ld.reason.type, "uncoveredAttribution");
259
+ strictEqual(ld.checks[0].status, "verified");
260
+ strictEqual(reports[0].authentication.status, "verified");
261
+ });
262
+ test("onRequestFinished keeps valid OIP checks when attributions are uncovered", async () => {
263
+ const { federation, reports } = setup();
264
+ const activity = new Create({
265
+ id: new URL("https://example.com/proof"),
266
+ actor: new URL("https://example.com/person")
267
+ });
268
+ const signed = await signObject(activity, ed25519PrivateKey, ed25519Multikey.id, loaders);
269
+ strictEqual((await federation.fetch(request(await signed.toJsonLd(loaders)), { contextData: void 0 })).status, 401);
270
+ const proof = reports[0].attempts.find((attempt) => attempt.mechanism === "objectIntegrity");
271
+ ok(proof?.status === "rejected");
272
+ strictEqual(proof.reason.type, "uncoveredAttribution");
273
+ const check = proof.checks[0];
274
+ ok(check.status === "verified" && check.key.type === "multikey");
275
+ strictEqual(check.key.controllerId?.href, "https://example.com/person2");
276
+ strictEqual(reports[0].activity?.id?.href, activity.id?.href);
277
+ });
278
+ test("onRequestFinished reports listener failures with original values", async () => {
279
+ const { federation, setters, reports } = setup(true);
280
+ const error = /* @__PURE__ */ new Error("listener failed");
281
+ setters.on(Create, () => {
282
+ throw error;
283
+ });
284
+ strictEqual((await federation.fetch(request(await payload()), { contextData: void 0 })).status, 500);
285
+ deepStrictEqual(reports[0].outcome, {
286
+ type: "response",
287
+ status: 500,
288
+ disposition: "failed",
289
+ reason: "listenerError",
290
+ error
291
+ });
292
+ });
293
+ test("onRequestFinished builder snapshots callbacks", async () => {
294
+ const builder = createFederationBuilder();
295
+ builder.setActorDispatcher("/users/{identifier}", () => new Person({}));
296
+ const reports = [];
297
+ const setters = builder.setInboxListeners("/users/{identifier}/inbox", "/inbox").onRequestFinished((_ctx, report) => {
298
+ reports.push(report);
299
+ });
300
+ const federation = await builder.build({
301
+ kv: new MemoryKvStore(),
302
+ skipSignatureVerification: true,
303
+ documentLoaderFactory: () => mockDocumentLoader,
304
+ contextLoaderFactory: () => mockDocumentLoader
305
+ });
306
+ setters.onRequestFinished(() => {
307
+ throw new Error("new callback must not run");
308
+ });
309
+ await federation.fetch(request(await payload()), { contextData: void 0 });
310
+ strictEqual(reports.length, 1);
311
+ });
312
+ test("onRequestFinished key snapshots do not alias vocabulary metadata", async () => {
313
+ const { snapshotKey } = await import("../verification-C3954hQh.mjs");
314
+ const snapshot = snapshotKey(rsaPublicKey2);
315
+ snapshot.id.pathname = "/changed";
316
+ strictEqual(rsaPublicKey2.id.href, "https://example.com/key2");
317
+ strictEqual(snapshotKey(rsaPublicKey3).publicKey, rsaPublicKey3.publicKey);
318
+ });
319
+ test("onRequestFinished reports enqueue acceptance without adding queue fields", async () => {
320
+ const messages = [];
321
+ const reports = [];
322
+ const federation = createFederation({
323
+ kv: new MemoryKvStore(),
324
+ skipSignatureVerification: true,
325
+ manuallyStartQueue: true,
326
+ queue: { inbox: {
327
+ enqueue: (message) => {
328
+ messages.push(message);
329
+ return Promise.resolve();
330
+ },
331
+ listen: () => Promise.resolve()
332
+ } },
333
+ documentLoaderFactory: () => mockDocumentLoader,
334
+ contextLoaderFactory: () => mockDocumentLoader
335
+ });
336
+ federation.setActorDispatcher("/users/{identifier}", () => new Person({}));
337
+ federation.setInboxListeners("/users/{identifier}/inbox", "/inbox").onRequestFinished((_ctx, report) => {
338
+ reports.push(report);
339
+ });
340
+ strictEqual((await federation.fetch(request(await payload()), { contextData: void 0 })).status, 202);
341
+ deepStrictEqual(reports[0].outcome, {
342
+ type: "response",
343
+ status: 202,
344
+ disposition: "enqueued"
345
+ });
346
+ strictEqual(messages.length, 1);
347
+ ok(!("report" in messages[0]));
348
+ ok(!("attempts" in messages[0]));
349
+ });
350
+ test("onRequestFinished preserves a non-Error value thrown during enqueue", async () => {
351
+ const reports = [];
352
+ const federation = createFederation({
353
+ kv: new MemoryKvStore(),
354
+ skipSignatureVerification: true,
355
+ manuallyStartQueue: true,
356
+ queue: { inbox: {
357
+ enqueue: () => Promise.reject(void 0),
358
+ listen: () => Promise.resolve()
359
+ } },
360
+ documentLoaderFactory: () => mockDocumentLoader,
361
+ contextLoaderFactory: () => mockDocumentLoader
362
+ });
363
+ federation.setActorDispatcher("/users/{identifier}", () => new Person({}));
364
+ federation.setInboxListeners("/users/{identifier}/inbox", "/inbox").onRequestFinished((_ctx, report) => {
365
+ reports.push(report);
366
+ throw new Error("observer failure");
367
+ });
368
+ let threw = false;
369
+ try {
370
+ await federation.fetch(request(await payload()), { contextData: void 0 });
371
+ } catch (error) {
372
+ threw = true;
373
+ strictEqual(error, void 0);
374
+ }
375
+ strictEqual(threw, true);
376
+ strictEqual(reports.length, 1);
377
+ deepStrictEqual(reports[0].outcome, {
378
+ type: "exception",
379
+ stage: "dispatch",
380
+ error: void 0
381
+ });
382
+ });
383
+ test("onRequestFinished runs with tracing disabled", async () => {
384
+ const { AlwaysOffSampler, BasicTracerProvider } = await import("@opentelemetry/sdk-trace-base");
385
+ const provider = new BasicTracerProvider({ sampler: new AlwaysOffSampler() });
386
+ const reports = [];
387
+ const federation = createFederation({
388
+ kv: new MemoryKvStore(),
389
+ tracerProvider: provider,
390
+ skipSignatureVerification: true,
391
+ documentLoaderFactory: () => mockDocumentLoader,
392
+ contextLoaderFactory: () => mockDocumentLoader
393
+ });
394
+ federation.setActorDispatcher("/users/{identifier}", () => new Person({}));
395
+ federation.setInboxListeners("/users/{identifier}/inbox", "/inbox").onRequestFinished((_ctx, report) => {
396
+ reports.push(report);
397
+ });
398
+ await federation.fetch(request(await payload()), { contextData: void 0 });
399
+ strictEqual(reports.length, 1);
400
+ await provider.shutdown();
401
+ });
402
+ test("onRequestFinished preserves non-POST shared inbox behavior without reports", async () => {
403
+ const { federation, reports } = setup(true);
404
+ strictEqual((await federation.fetch(new Request("https://example.com/inbox", { headers: { Accept: "application/activity+json" } }), { contextData: void 0 })).status, 400);
405
+ strictEqual(reports.length, 0);
406
+ strictEqual((await federation.fetch(new Request("https://example.com/inbox", {
407
+ method: "PUT",
408
+ body: JSON.stringify(await payload()),
409
+ headers: { Accept: "application/activity+json" }
410
+ }), { contextData: void 0 })).status, 202);
411
+ strictEqual(reports.length, 0);
412
+ });
413
+ test("onRequestFinished covers errors constructing the initial request context", async () => {
414
+ const reports = [];
415
+ const error = /* @__PURE__ */ new Error("loader factory failed");
416
+ const federation = createFederation({
417
+ kv: new MemoryKvStore(),
418
+ documentLoaderFactory: () => {
419
+ throw error;
420
+ },
421
+ contextLoaderFactory: () => mockDocumentLoader
422
+ });
423
+ federation.setActorDispatcher("/users/{identifier}", () => new Person({}));
424
+ federation.setInboxListeners("/users/{identifier}/inbox", "/inbox").onRequestFinished((ctx, report) => {
425
+ strictEqual(ctx.data, "data");
426
+ strictEqual(ctx.request.url, "https://example.com/inbox");
427
+ reports.push(report);
428
+ });
429
+ await rejects(federation.fetch(request({}), { contextData: "data" }), (value) => value === error);
430
+ strictEqual(reports.length, 1);
431
+ deepStrictEqual(reports[0].outcome, {
432
+ type: "exception",
433
+ stage: "prepare",
434
+ error
435
+ });
436
+ });
437
+ test("onRequestFinished observes the final response decoration result", async () => {
438
+ const { federation, setters, reports } = setup();
439
+ const redirect = Response.redirect("https://example.com/redirect", 302);
440
+ let immutable = false;
441
+ try {
442
+ redirect.headers.set("X-Header-Probe", "probe");
443
+ } catch {
444
+ immutable = true;
445
+ }
446
+ setters.onUnverifiedActivity(() => redirect);
447
+ const delivery = request(await payload());
448
+ delivery.headers.set("Accept", "application/activity+json");
449
+ let thrown;
450
+ let response;
451
+ try {
452
+ response = await federation.fetch(delivery, { contextData: void 0 });
453
+ } catch (error) {
454
+ thrown = error;
455
+ }
456
+ strictEqual(reports.length, 1);
457
+ if (immutable) {
458
+ ok(thrown instanceof TypeError);
459
+ deepStrictEqual(reports[0].outcome, {
460
+ type: "exception",
461
+ stage: "respond",
462
+ error: thrown
463
+ });
464
+ } else {
465
+ strictEqual(thrown, void 0);
466
+ strictEqual(response?.status, 302);
467
+ deepStrictEqual(reports[0].outcome, {
468
+ type: "response",
469
+ status: 302,
470
+ disposition: "customResponse"
471
+ });
472
+ }
473
+ });
474
+ //#endregion
475
+ export {};
@@ -4,7 +4,7 @@ globalThis.addEventListener = () => {};
4
4
  import { t as assertEquals } from "../assert_equals-Z6IcEbWU.mjs";
5
5
  import "../std__assert-DvMDRPes.mjs";
6
6
  import { t as assertRejects } from "../assert_rejects-CTptdYck.mjs";
7
- import { _ as recordKeyLookup, a as instrumentDocumentLoader, b as recordWebFingerHandle, c as recordCircuitBreakerStateChange, d as recordCollectionRequest, f as recordCollectionTotalItems, g as recordInboxActivity, h as recordFanoutRecipients, i as getRemoteHost, l as recordCollectionDispatchDuration, m as recordDocumentFetch, p as recordDocumentCache, r as getFederationMetrics, t as classifyFetchError, u as recordCollectionPageItems, v as recordOutboxActivity, x as registerQueueDepthGauge, y as recordOutboxEnqueue } from "../metrics-CocsZP0E.mjs";
7
+ import { _ as recordKeyLookup, a as instrumentDocumentLoader, b as recordWebFingerHandle, c as recordCircuitBreakerStateChange, d as recordCollectionRequest, f as recordCollectionTotalItems, g as recordInboxActivity, h as recordFanoutRecipients, i as getRemoteHost, l as recordCollectionDispatchDuration, m as recordDocumentFetch, p as recordDocumentCache, r as getFederationMetrics, t as classifyFetchError, u as recordCollectionPageItems, v as recordOutboxActivity, x as registerQueueDepthGauge, y as recordOutboxEnqueue } from "../metrics-BbBj-VZN.mjs";
8
8
  import { FetchError } from "@fedify/vocab-runtime";
9
9
  import { createTestMeterProvider, test } from "@fedify/fixture";
10
10
  import { DataPointType, MeterProvider, MetricReader } from "@opentelemetry/sdk-metrics";
@@ -16,14 +16,14 @@ import "../std__assert-DvMDRPes.mjs";
16
16
  import { t as assertRejects } from "../assert_rejects-CTptdYck.mjs";
17
17
  import { t as assertStrictEquals } from "../assert_strict_equals-CYvBmkpC.mjs";
18
18
  import { t as assert } from "../assert-D1Eafmd_.mjs";
19
- import { g as recordInboxActivity } from "../metrics-CocsZP0E.mjs";
20
- import { a as compactJsonLd, h as verifyJsonLd, p as signJsonLd, s as detachSignature } from "../ld-Cf4CPWN_.mjs";
21
- import { a as signObject, s as verifyObject } from "../proof-8WiH_-Gq.mjs";
22
- import { f as verifyRequest, l as signRequest } from "../http-DkqWu-sm.mjs";
19
+ import { g as recordInboxActivity } from "../metrics-BbBj-VZN.mjs";
20
+ import { a as compactJsonLd, h as verifyJsonLd, p as signJsonLd, s as detachSignature } from "../ld-BDMNyM2M.mjs";
21
+ import { a as signObject, s as verifyObject } from "../proof-nce4pf5S.mjs";
22
+ import { f as verifyRequest, l as signRequest } from "../http-DvpuyDJB.mjs";
23
23
  import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-DIJNHW-Y.mjs";
24
- import { t as getAuthenticatedDocumentLoader } from "../docloader-CIP_SG39.mjs";
25
- import { T as handleBenchmarkTrigger, i as KvSpecDeterminer, n as FederationImpl, o as createFederation, r as InboxContextImpl, t as ContextImpl } from "../middleware-Dxn0E9ES.mjs";
26
- import { t as doesActorOwnKey } from "../owner-DSJ7nFgy.mjs";
24
+ import { t as getAuthenticatedDocumentLoader } from "../docloader-Dv1JJl37.mjs";
25
+ import { T as handleBenchmarkTrigger, i as KvSpecDeterminer, n as FederationImpl, o as createFederation, r as InboxContextImpl, t as ContextImpl } from "../middleware-DAA7wDdS.mjs";
26
+ import { t as doesActorOwnKey } from "../owner-CzUycuhd.mjs";
27
27
  import { t as CircuitBreaker } from "../circuit-breaker-XJ53md4S.mjs";
28
28
  import { t as TaskCodec } from "../codec-C6rTrpIp.mjs";
29
29
  import { t as markCircuitBreakerLegacySweepDone } from "../circuit-breaker-test-utils-DW6YC_Pe.mjs";
@@ -1,6 +1,6 @@
1
1
  const { URLPattern } = require("urlpattern-polyfill");
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const require_federation = require("../federation-BDzIgqOd.cjs");
3
+ const require_federation = require("../federation-Bo5z395X.cjs");
4
4
  exports.CircuitBreaker = require_federation.CircuitBreaker;
5
5
  exports.InProcessMessageQueue = require_federation.InProcessMessageQueue;
6
6
  exports.MemoryKvStore = require_federation.MemoryKvStore;
@@ -1,5 +1,6 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { $ as respondWithObject, $t as digest, A as InboxChallengePolicy, At as CustomCollectionDispatcher, B as createFederation, Bt as OutboxListener, C as FederationBenchmarkOptions, Ct as ActorKeyPairsDispatcher, D as FederationStartQueueOptions, Dt as CollectionDispatcher, E as FederationOptions, Et as CollectionCursor, F as PortableInboxForwardingOptions, Ft as MediaUploaderCallback, G as TaskEnqueueOptions, Gt as SharedInboxKeyDispatcher, H as createFederationBuilder, Ht as OutboxPermanentFailureHandler, I as Rfc6570Expression, It as NodeInfoDispatcher, J as CreateExponentialBackoffPolicyOptions, Jt as WebFingerLinksDispatcher, K as TaskHandler, Kt as UnverifiedActivityHandler, L as FederationKvPrefixes, Lt as ObjectAuthorizePredicate, M as MediaUploaderSetters, Mt as HashlinkMediaRequest, N as ObjectCallbackSetters, Nt as InboxErrorHandler, O as IdempotencyKeyCallback, Ot as CustomCollectionCounter, P as OutboxListenerSetters, Pt as InboxListener, Q as RespondWithObjectOptions, Qt as buildCollectionSynchronizationHeader, R as FederationOrigin, Rt as ObjectDispatcher, S as Federation, St as ActorHandleMapper, T as FederationFetchOptions, Tt as CollectionCounter, U as TaskDefinition, Ut as PortableActorIdMapper, V as Message, Vt as OutboxListenerErrorHandler, W as TaskDefinitionOptions, Wt as PortableCollectionOwnerMapper, X as RetryPolicy, Xt as SenderKeyPair, Y as RetryContext, Yt as SendActivityError, Z as createExponentialBackoffPolicy, Zt as PageItems, _ as ActorCallbackSetters, _t as NormalizedCircuitBreakerOptions, a as GetObjectOptions, at as MessageQueueEnqueueOptions, b as CustomCollectionCallbackSetters, bt as ActorAliasMapper, c as IsSignedByAudienceOptions, ct as CircuitBreaker, d as ParseUriResult, dt as CircuitBreakerCreateOptions, et as respondWithObjectIfAcceptable, f as PortableRequest, ft as CircuitBreakerFailurePolicy, g as SendActivityOptionsForCollection, gt as CircuitBreakerStateChange, h as SendActivityOptions, ht as CircuitBreakerState, i as GetActorOptions, it as MessageQueueDepth, j as InboxListenerSetters, jt as HashlinkMediaDispatcher, k as IdempotencyStrategy, kt as CustomCollectionCursor, l as OutboxContext, lt as CircuitBreakerActivityDrop, m as RouteActivityOptions, mt as CircuitBreakerOptions, n as Context, nt as InProcessMessageQueueOptions, o as GetSignedKeyOptions, ot as MessageQueueListenOptions, p as RequestContext, pt as CircuitBreakerKvState, q as TaskRegistry, qt as UnverifiedActivityReason, r as ForwardActivityOptions, rt as MessageQueue, s as InboxContext, st as ParallelMessageQueue, t as ActorKeyPair, tt as InProcessMessageQueue, u as ParseUriOptions, ut as CircuitBreakerBeforeSendDecision, v as CollectionCallbackSetters, vt as normalizeCircuitBreakerOptions, w as FederationBuilder, wt as AuthorizePredicate, x as Federatable, xt as ActorDispatcher, y as ConstructorWithTypeId, yt as parseCircuitBreakerKvState, z as FederationQueueOptions, zt as OutboxErrorHandler } from "../context-B6X-t8gI.cjs";
2
+ import { _ as InboxVerificationKey, d as InboxProofPolicyFailureReason, f as InboxSignatureCheck, g as InboxVerificationFailureReason, h as InboxVerificationAttempt, m as InboxSignatureIdentity, p as InboxSignatureFailureReason } from "../key-DYxuyd-s.cjs";
3
+ import { $ as respondWithObject, $t as digest, A as InboxChallengePolicy, At as CustomCollectionDispatcher, B as createFederation, Bt as OutboxListener, C as FederationBenchmarkOptions, Ct as ActorKeyPairsDispatcher, D as FederationStartQueueOptions, Dt as CollectionDispatcher, E as FederationOptions, Et as CollectionCursor, F as PortableInboxForwardingOptions, Ft as MediaUploaderCallback, G as TaskEnqueueOptions, Gt as SharedInboxKeyDispatcher, H as createFederationBuilder, Ht as OutboxPermanentFailureHandler, I as Rfc6570Expression, It as NodeInfoDispatcher, J as CreateExponentialBackoffPolicyOptions, Jt as WebFingerLinksDispatcher, K as TaskHandler, Kt as UnverifiedActivityHandler, L as FederationKvPrefixes, Lt as ObjectAuthorizePredicate, M as MediaUploaderSetters, Mt as HashlinkMediaRequest, N as ObjectCallbackSetters, Nt as InboxErrorHandler, O as IdempotencyKeyCallback, Ot as CustomCollectionCounter, P as OutboxListenerSetters, Pt as InboxListener, Q as RespondWithObjectOptions, Qt as buildCollectionSynchronizationHeader, R as FederationOrigin, Rt as ObjectDispatcher, S as Federation, St as ActorHandleMapper, T as FederationFetchOptions, Tt as CollectionCounter, U as TaskDefinition, Ut as PortableActorIdMapper, V as Message, Vt as OutboxListenerErrorHandler, W as TaskDefinitionOptions, Wt as PortableCollectionOwnerMapper, X as RetryPolicy, Xt as SenderKeyPair, Y as RetryContext, Yt as SendActivityError, Z as createExponentialBackoffPolicy, Zt as PageItems, _ as ActorCallbackSetters, _t as NormalizedCircuitBreakerOptions, a as GetObjectOptions, an as InboxRequestReport, at as MessageQueueEnqueueOptions, b as CustomCollectionCallbackSetters, bt as ActorAliasMapper, c as IsSignedByAudienceOptions, ct as CircuitBreaker, d as ParseUriResult, dt as CircuitBreakerCreateOptions, et as respondWithObjectIfAcceptable, f as PortableRequest, ft as CircuitBreakerFailurePolicy, g as SendActivityOptionsForCollection, gt as CircuitBreakerStateChange, h as SendActivityOptions, ht as CircuitBreakerState, i as GetActorOptions, in as InboxRequestOutcome, it as MessageQueueDepth, j as InboxListenerSetters, jt as HashlinkMediaDispatcher, k as IdempotencyStrategy, kt as CustomCollectionCursor, l as OutboxContext, lt as CircuitBreakerActivityDrop, m as RouteActivityOptions, mt as CircuitBreakerOptions, n as Context, nn as InboxJsonValue, nt as InProcessMessageQueueOptions, o as GetSignedKeyOptions, ot as MessageQueueListenOptions, p as RequestContext, pt as CircuitBreakerKvState, q as TaskRegistry, qt as UnverifiedActivityReason, r as ForwardActivityOptions, rn as InboxRequestFinishedHandler, rt as MessageQueue, s as InboxContext, st as ParallelMessageQueue, t as ActorKeyPair, tn as InboxAuthentication, tt as InProcessMessageQueue, u as ParseUriOptions, ut as CircuitBreakerBeforeSendDecision, v as CollectionCallbackSetters, vt as normalizeCircuitBreakerOptions, w as FederationBuilder, wt as AuthorizePredicate, x as Federatable, xt as ActorDispatcher, y as ConstructorWithTypeId, yt as parseCircuitBreakerKvState, z as FederationQueueOptions, zt as OutboxErrorHandler } from "../context-tsYPJ2Ew.cjs";
3
4
  import { a as MemoryKvStore, i as KvStoreSetOptions, n as KvStore, r as KvStoreListEntry, t as KvKey } from "../kv-B2mzK5tl.cjs";
4
- import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-C7_2j7VT.cjs";
5
- 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, GetObjectOptions, GetSignedKeyOptions, HashlinkMediaDispatcher, HashlinkMediaRequest, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxChallengePolicy, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, IsSignedByAudienceOptions, 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, ParseUriOptions, ParseUriResult, PortableActorIdMapper, PortableCollectionOwnerMapper, PortableInboxForwardingOptions, PortableRequest, 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-BojP2Bw3.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, GetObjectOptions, GetSignedKeyOptions, HashlinkMediaDispatcher, HashlinkMediaRequest, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxAuthentication, InboxChallengePolicy, InboxContext, InboxErrorHandler, InboxJsonValue, InboxListener, InboxListenerSetters, InboxProofPolicyFailureReason, InboxRequestFinishedHandler, InboxRequestOutcome, InboxRequestReport, InboxSignatureCheck, InboxSignatureFailureReason, InboxSignatureIdentity, InboxVerificationAttempt, InboxVerificationFailureReason, InboxVerificationKey, IsSignedByAudienceOptions, 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, ParseUriOptions, ParseUriResult, PortableActorIdMapper, PortableCollectionOwnerMapper, PortableInboxForwardingOptions, PortableRequest, 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,5 +1,6 @@
1
1
  /// <reference lib="esnext.temporal" />
2
- import { $ as respondWithObject, $t as digest, A as InboxChallengePolicy, At as CustomCollectionDispatcher, B as createFederation, Bt as OutboxListener, C as FederationBenchmarkOptions, Ct as ActorKeyPairsDispatcher, D as FederationStartQueueOptions, Dt as CollectionDispatcher, E as FederationOptions, Et as CollectionCursor, F as PortableInboxForwardingOptions, Ft as MediaUploaderCallback, G as TaskEnqueueOptions, Gt as SharedInboxKeyDispatcher, H as createFederationBuilder, Ht as OutboxPermanentFailureHandler, I as Rfc6570Expression, It as NodeInfoDispatcher, J as CreateExponentialBackoffPolicyOptions, Jt as WebFingerLinksDispatcher, K as TaskHandler, Kt as UnverifiedActivityHandler, L as FederationKvPrefixes, Lt as ObjectAuthorizePredicate, M as MediaUploaderSetters, Mt as HashlinkMediaRequest, N as ObjectCallbackSetters, Nt as InboxErrorHandler, O as IdempotencyKeyCallback, Ot as CustomCollectionCounter, P as OutboxListenerSetters, Pt as InboxListener, Q as RespondWithObjectOptions, Qt as buildCollectionSynchronizationHeader, R as FederationOrigin, Rt as ObjectDispatcher, S as Federation, St as ActorHandleMapper, T as FederationFetchOptions, Tt as CollectionCounter, U as TaskDefinition, Ut as PortableActorIdMapper, V as Message, Vt as OutboxListenerErrorHandler, W as TaskDefinitionOptions, Wt as PortableCollectionOwnerMapper, X as RetryPolicy, Xt as SenderKeyPair, Y as RetryContext, Yt as SendActivityError, Z as createExponentialBackoffPolicy, Zt as PageItems, _ as ActorCallbackSetters, _t as NormalizedCircuitBreakerOptions, a as GetObjectOptions, at as MessageQueueEnqueueOptions, b as CustomCollectionCallbackSetters, bt as ActorAliasMapper, c as IsSignedByAudienceOptions, ct as CircuitBreaker, d as ParseUriResult, dt as CircuitBreakerCreateOptions, et as respondWithObjectIfAcceptable, f as PortableRequest, ft as CircuitBreakerFailurePolicy, g as SendActivityOptionsForCollection, gt as CircuitBreakerStateChange, h as SendActivityOptions, ht as CircuitBreakerState, i as GetActorOptions, it as MessageQueueDepth, j as InboxListenerSetters, jt as HashlinkMediaDispatcher, k as IdempotencyStrategy, kt as CustomCollectionCursor, l as OutboxContext, lt as CircuitBreakerActivityDrop, m as RouteActivityOptions, mt as CircuitBreakerOptions, n as Context, nt as InProcessMessageQueueOptions, o as GetSignedKeyOptions, ot as MessageQueueListenOptions, p as RequestContext, pt as CircuitBreakerKvState, q as TaskRegistry, qt as UnverifiedActivityReason, r as ForwardActivityOptions, rt as MessageQueue, s as InboxContext, st as ParallelMessageQueue, t as ActorKeyPair, tt as InProcessMessageQueue, u as ParseUriOptions, ut as CircuitBreakerBeforeSendDecision, v as CollectionCallbackSetters, vt as normalizeCircuitBreakerOptions, w as FederationBuilder, wt as AuthorizePredicate, x as Federatable, xt as ActorDispatcher, y as ConstructorWithTypeId, yt as parseCircuitBreakerKvState, z as FederationQueueOptions, zt as OutboxErrorHandler } from "../context-CtI307_A.js";
2
+ import { _ as InboxVerificationKey, d as InboxProofPolicyFailureReason, f as InboxSignatureCheck, g as InboxVerificationFailureReason, h as InboxVerificationAttempt, m as InboxSignatureIdentity, p as InboxSignatureFailureReason } from "../key-C1nv7_jD.js";
3
+ import { $ as respondWithObject, $t as digest, A as InboxChallengePolicy, At as CustomCollectionDispatcher, B as createFederation, Bt as OutboxListener, C as FederationBenchmarkOptions, Ct as ActorKeyPairsDispatcher, D as FederationStartQueueOptions, Dt as CollectionDispatcher, E as FederationOptions, Et as CollectionCursor, F as PortableInboxForwardingOptions, Ft as MediaUploaderCallback, G as TaskEnqueueOptions, Gt as SharedInboxKeyDispatcher, H as createFederationBuilder, Ht as OutboxPermanentFailureHandler, I as Rfc6570Expression, It as NodeInfoDispatcher, J as CreateExponentialBackoffPolicyOptions, Jt as WebFingerLinksDispatcher, K as TaskHandler, Kt as UnverifiedActivityHandler, L as FederationKvPrefixes, Lt as ObjectAuthorizePredicate, M as MediaUploaderSetters, Mt as HashlinkMediaRequest, N as ObjectCallbackSetters, Nt as InboxErrorHandler, O as IdempotencyKeyCallback, Ot as CustomCollectionCounter, P as OutboxListenerSetters, Pt as InboxListener, Q as RespondWithObjectOptions, Qt as buildCollectionSynchronizationHeader, R as FederationOrigin, Rt as ObjectDispatcher, S as Federation, St as ActorHandleMapper, T as FederationFetchOptions, Tt as CollectionCounter, U as TaskDefinition, Ut as PortableActorIdMapper, V as Message, Vt as OutboxListenerErrorHandler, W as TaskDefinitionOptions, Wt as PortableCollectionOwnerMapper, X as RetryPolicy, Xt as SenderKeyPair, Y as RetryContext, Yt as SendActivityError, Z as createExponentialBackoffPolicy, Zt as PageItems, _ as ActorCallbackSetters, _t as NormalizedCircuitBreakerOptions, a as GetObjectOptions, an as InboxRequestReport, at as MessageQueueEnqueueOptions, b as CustomCollectionCallbackSetters, bt as ActorAliasMapper, c as IsSignedByAudienceOptions, ct as CircuitBreaker, d as ParseUriResult, dt as CircuitBreakerCreateOptions, et as respondWithObjectIfAcceptable, f as PortableRequest, ft as CircuitBreakerFailurePolicy, g as SendActivityOptionsForCollection, gt as CircuitBreakerStateChange, h as SendActivityOptions, ht as CircuitBreakerState, i as GetActorOptions, in as InboxRequestOutcome, it as MessageQueueDepth, j as InboxListenerSetters, jt as HashlinkMediaDispatcher, k as IdempotencyStrategy, kt as CustomCollectionCursor, l as OutboxContext, lt as CircuitBreakerActivityDrop, m as RouteActivityOptions, mt as CircuitBreakerOptions, n as Context, nn as InboxJsonValue, nt as InProcessMessageQueueOptions, o as GetSignedKeyOptions, ot as MessageQueueListenOptions, p as RequestContext, pt as CircuitBreakerKvState, q as TaskRegistry, qt as UnverifiedActivityReason, r as ForwardActivityOptions, rn as InboxRequestFinishedHandler, rt as MessageQueue, s as InboxContext, st as ParallelMessageQueue, t as ActorKeyPair, tn as InboxAuthentication, tt as InProcessMessageQueue, u as ParseUriOptions, ut as CircuitBreakerBeforeSendDecision, v as CollectionCallbackSetters, vt as normalizeCircuitBreakerOptions, w as FederationBuilder, wt as AuthorizePredicate, x as Federatable, xt as ActorDispatcher, y as ConstructorWithTypeId, yt as parseCircuitBreakerKvState, z as FederationQueueOptions, zt as OutboxErrorHandler } from "../context-7NyiqIcg.js";
3
4
  import { a as MemoryKvStore, i as KvStoreSetOptions, n as KvStore, r as KvStoreListEntry, t as KvKey } from "../kv-B2mzK5tl.js";
4
- import { a as RouterOptions, i as RouterError, n as handleWebFinger, o as RouterRouteResult, r as Router, t as WebFingerHandlerParameters } from "../mod-BhTaDR5H.js";
5
- 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, GetObjectOptions, GetSignedKeyOptions, HashlinkMediaDispatcher, HashlinkMediaRequest, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxChallengePolicy, InboxContext, InboxErrorHandler, InboxListener, InboxListenerSetters, IsSignedByAudienceOptions, 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, ParseUriOptions, ParseUriResult, PortableActorIdMapper, PortableCollectionOwnerMapper, PortableInboxForwardingOptions, PortableRequest, 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-Xj5P4s4d.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, GetObjectOptions, GetSignedKeyOptions, HashlinkMediaDispatcher, HashlinkMediaRequest, IdempotencyKeyCallback, IdempotencyStrategy, InProcessMessageQueue, InProcessMessageQueueOptions, InboxAuthentication, InboxChallengePolicy, InboxContext, InboxErrorHandler, InboxJsonValue, InboxListener, InboxListenerSetters, InboxProofPolicyFailureReason, InboxRequestFinishedHandler, InboxRequestOutcome, InboxRequestReport, InboxSignatureCheck, InboxSignatureFailureReason, InboxSignatureIdentity, InboxVerificationAttempt, InboxVerificationFailureReason, InboxVerificationKey, IsSignedByAudienceOptions, 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, ParseUriOptions, ParseUriResult, PortableActorIdMapper, PortableCollectionOwnerMapper, PortableInboxForwardingOptions, PortableRequest, 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
  import { Temporal } from "temporal-polyfill";
2
2
  import { URLPattern } from "urlpattern-polyfill";
3
- import { a as respondWithObjectIfAcceptable, c as digest, d as parseCircuitBreakerKvState, f as createFederationBuilder, i as respondWithObject, l as CircuitBreaker, n as handleWebFinger, o as SendActivityError, r as createExponentialBackoffPolicy, s as buildCollectionSynchronizationHeader, t as createFederation, u as normalizeCircuitBreakerOptions } from "../middleware-BfYke3YQ.js";
3
+ import { a as respondWithObjectIfAcceptable, c as digest, d as parseCircuitBreakerKvState, f as createFederationBuilder, i as respondWithObject, l as CircuitBreaker, n as handleWebFinger, o as SendActivityError, r as createExponentialBackoffPolicy, s as buildCollectionSynchronizationHeader, t as createFederation, u as normalizeCircuitBreakerOptions } from "../middleware-DfUWPAa-.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";