@fedify/fedify 2.1.0-dev.565 → 2.1.0-dev.599

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 (96) hide show
  1. package/dist/accept-D7sAxyNa.js +143 -0
  2. package/dist/{assert_rejects-Ce45JcFg.js → assert_rejects-0h7I2Esa.js} +1 -1
  3. package/dist/{builder-Deoi2N2z.js → builder-rlJT9XsH.js} +3 -3
  4. package/dist/compat/mod.d.cts +3 -3
  5. package/dist/compat/mod.d.ts +3 -3
  6. package/dist/compat/transformers.test.js +17 -16
  7. package/dist/{context-DL0cPpPV.d.cts → context-BcqA-0BL.d.cts} +52 -2
  8. package/dist/{context--RwChtri.d.ts → context-DyJjQQ_H.d.ts} +52 -2
  9. package/dist/{deno-CEdy89j9.js → deno-BYv1FXyT.js} +1 -2
  10. package/dist/{docloader-CL1QPJzN.js → docloader-D3dGL8MN.js} +2 -2
  11. package/dist/federation/builder.test.js +7 -7
  12. package/dist/federation/collection.test.js +5 -5
  13. package/dist/federation/handler.test.js +806 -26
  14. package/dist/federation/idempotency.test.js +22 -21
  15. package/dist/federation/inbox.test.js +3 -3
  16. package/dist/federation/keycache.test.js +1 -1
  17. package/dist/federation/kv.test.js +4 -4
  18. package/dist/federation/middleware.test.js +22 -21
  19. package/dist/federation/mod.cjs +4 -4
  20. package/dist/federation/mod.d.cts +4 -4
  21. package/dist/federation/mod.d.ts +4 -4
  22. package/dist/federation/mod.js +4 -4
  23. package/dist/federation/mq.test.js +4 -4
  24. package/dist/federation/negotiation.test.js +5 -5
  25. package/dist/federation/retry.test.js +2 -2
  26. package/dist/federation/router.test.js +4 -4
  27. package/dist/federation/send.test.js +11 -10
  28. package/dist/federation/webfinger.test.js +22 -21
  29. package/dist/{http-DsqqmkXi.d.cts → http-BudnHZE2.d.cts} +229 -1
  30. package/dist/{http-iDlaLy8a.cjs → http-Cjdbgipx.cjs} +307 -50
  31. package/dist/{http-BbfOqHGG.d.ts → http-Dax_FIBo.d.ts} +229 -1
  32. package/dist/{http-Dm9n1mRe.js → http-SDJbghtm.js} +144 -49
  33. package/dist/{http-VpqmUjje.js → http-WrV4DdQ1.js} +278 -51
  34. package/dist/{inbox-CMtnW0RE.js → inbox-gPJ0RaKj.js} +1 -1
  35. package/dist/{key-B0yADkL8.js → key-BSOrewQw.js} +1 -1
  36. package/dist/{kv-cache-BSATpUtX.js → kv-cache-D0a-g8yG.js} +1 -1
  37. package/dist/{kv-cache-551Om14-.cjs → kv-cache-sn8V-LU_.cjs} +1 -1
  38. package/dist/{ld-BBmbv1nb.js → ld-8UNDFIO0.js} +3 -3
  39. package/dist/middleware-74Kx7iWO.cjs +12 -0
  40. package/dist/{middleware-DpdPMZII.js → middleware-Brge9sYu.js} +4 -4
  41. package/dist/{middleware-Cldp2YSv.js → middleware-CWItYNUL.js} +113 -34
  42. package/dist/{middleware-Cx0tTbX1.js → middleware-C_89nqvv.js} +95 -18
  43. package/dist/{middleware-D11GYoP-.cjs → middleware-PGDxr3nC.cjs} +94 -17
  44. package/dist/middleware-nfE7By0g.js +27 -0
  45. package/dist/{mod-DE8MYisy.d.cts → mod-B7QkWzrL.d.cts} +1 -1
  46. package/dist/{mod-DKG0ovjR.d.cts → mod-Bx9jcLB8.d.cts} +1 -1
  47. package/dist/{mod-CFBU2OT3.d.cts → mod-Coe7KEgX.d.cts} +1 -1
  48. package/dist/{mod-BugwI0JN.d.ts → mod-Cs2dYEwI.d.ts} +1 -1
  49. package/dist/{mod-DcfFNgYf.d.ts → mod-D6MdymW7.d.ts} +1 -1
  50. package/dist/{mod-CvxylbuV.d.ts → mod-D6dOd--H.d.ts} +1 -1
  51. package/dist/{mod-Z7lIaCfo.d.ts → mod-SMHOMNpZ.d.ts} +1 -1
  52. package/dist/{mod-Dp0kK0hO.d.cts → mod-em2Il1eD.d.cts} +1 -1
  53. package/dist/mod.cjs +12 -4
  54. package/dist/mod.d.cts +8 -8
  55. package/dist/mod.d.ts +8 -8
  56. package/dist/mod.js +9 -5
  57. package/dist/nodeinfo/client.test.js +4 -4
  58. package/dist/nodeinfo/handler.test.js +22 -21
  59. package/dist/nodeinfo/types.test.js +4 -4
  60. package/dist/otel/exporter.test.js +4 -4
  61. package/dist/{owner-C1ZyG4NL.js → owner-D1i3Gz1q.js} +1 -1
  62. package/dist/{proof-wclcUq0C.js → proof-Blm7rPHe.js} +2 -2
  63. package/dist/{proof-CgK60TcQ.cjs → proof-DFqGzNZi.cjs} +3 -3
  64. package/dist/{proof-DnRq8s8f.js → proof-DgU0YpXY.js} +2 -2
  65. package/dist/{send-DNJyYRVU.js → send-Ban_thmx.js} +2 -2
  66. package/dist/sig/accept.test.d.ts +3 -0
  67. package/dist/sig/accept.test.js +451 -0
  68. package/dist/sig/http.test.js +452 -27
  69. package/dist/sig/key.test.js +7 -7
  70. package/dist/sig/ld.test.js +6 -6
  71. package/dist/sig/mod.cjs +6 -2
  72. package/dist/sig/mod.d.cts +3 -3
  73. package/dist/sig/mod.d.ts +3 -3
  74. package/dist/sig/mod.js +3 -3
  75. package/dist/sig/owner.test.js +8 -8
  76. package/dist/sig/proof.test.js +8 -8
  77. package/dist/testing/mod.js +1 -1
  78. package/dist/utils/docloader.test.js +10 -9
  79. package/dist/utils/kv-cache.test.js +1 -1
  80. package/dist/utils/mod.cjs +2 -2
  81. package/dist/utils/mod.d.cts +2 -2
  82. package/dist/utils/mod.d.ts +2 -2
  83. package/dist/utils/mod.js +2 -2
  84. package/package.json +6 -7
  85. package/dist/middleware-BDr0P6dx.cjs +0 -12
  86. package/dist/middleware-BZ8WpBo6.js +0 -26
  87. /package/dist/{assert_not_equals-C80BG-_5.js → assert_not_equals-f3m3epl3.js} +0 -0
  88. /package/dist/{assert_throws-BNXdRGWP.js → assert_throws-rjdMBf31.js} +0 -0
  89. /package/dist/{collection-CcnIw1qY.js → collection-CSzG2j1P.js} +0 -0
  90. /package/dist/{context-pa9aIrwp.js → context-Aqenou7c.js} +0 -0
  91. /package/dist/{keycache-C7k8s1Bk.js → keycache-CpGWAUbj.js} +0 -0
  92. /package/dist/{keys-ZbcByPg9.js → keys-BFve7QQv.js} +0 -0
  93. /package/dist/{kv-cache-El7We5sy.js → kv-cache-Bw2F2ABq.js} +0 -0
  94. /package/dist/{negotiation-5NPJL6zp.js → negotiation-BlAuS_nr.js} +0 -0
  95. /package/dist/{retry-D4GJ670a.js → retry-mqLf4b-R.js} +0 -0
  96. /package/dist/{std__assert-DWivtrGR.js → std__assert-X-_kMxKM.js} +0 -0
@@ -0,0 +1,451 @@
1
+
2
+ import { Temporal } from "@js-temporal/polyfill";
3
+ import { URLPattern } from "urlpattern-polyfill";
4
+ globalThis.addEventListener = () => {};
5
+
6
+ import { formatAcceptSignature, fulfillAcceptSignature, parseAcceptSignature, validateAcceptSignature } from "../accept-D7sAxyNa.js";
7
+ import { test } from "@fedify/fixture";
8
+ import { deepStrictEqual, strictEqual } from "node:assert/strict";
9
+
10
+ //#region src/sig/accept.test.ts
11
+ test("parseAcceptSignature(): single entry", () => {
12
+ const result = parseAcceptSignature("sig1=(\"@method\" \"@target-uri\")");
13
+ deepStrictEqual(result, [{
14
+ label: "sig1",
15
+ components: [{
16
+ value: "@method",
17
+ params: {}
18
+ }, {
19
+ value: "@target-uri",
20
+ params: {}
21
+ }],
22
+ parameters: {}
23
+ }]);
24
+ });
25
+ test("parseAcceptSignature(): multiple entries", () => {
26
+ const result = parseAcceptSignature("sig1=(\"@method\"), sig2=(\"@authority\")");
27
+ deepStrictEqual(result, [{
28
+ label: "sig1",
29
+ components: [{
30
+ value: "@method",
31
+ params: {}
32
+ }],
33
+ parameters: {}
34
+ }, {
35
+ label: "sig2",
36
+ components: [{
37
+ value: "@authority",
38
+ params: {}
39
+ }],
40
+ parameters: {}
41
+ }]);
42
+ });
43
+ test("parseAcceptSignature(): all six parameters", () => {
44
+ const result = parseAcceptSignature("sig1=(\"@method\");keyid=\"k1\";alg=\"rsa-v1_5-sha256\";created;expires;nonce=\"abc\";tag=\"t1\"");
45
+ deepStrictEqual(result, [{
46
+ label: "sig1",
47
+ components: [{
48
+ value: "@method",
49
+ params: {}
50
+ }],
51
+ parameters: {
52
+ keyid: "k1",
53
+ alg: "rsa-v1_5-sha256",
54
+ created: true,
55
+ expires: true,
56
+ nonce: "abc",
57
+ tag: "t1"
58
+ }
59
+ }]);
60
+ });
61
+ test("parseAcceptSignature(): preserves string component parameters", () => {
62
+ const result = parseAcceptSignature("sig1=(\"@query-param\";name=\"foo\" \"@method\")");
63
+ deepStrictEqual(result, [{
64
+ label: "sig1",
65
+ components: [{
66
+ value: "@query-param",
67
+ params: { name: "foo" }
68
+ }, {
69
+ value: "@method",
70
+ params: {}
71
+ }],
72
+ parameters: {}
73
+ }]);
74
+ });
75
+ test("parseAcceptSignature(): preserves boolean component parameters", () => {
76
+ const result = parseAcceptSignature("sig1=(\"content-type\";sf \"content-digest\";bs)");
77
+ deepStrictEqual(result, [{
78
+ label: "sig1",
79
+ components: [{
80
+ value: "content-type",
81
+ params: { sf: true }
82
+ }, {
83
+ value: "content-digest",
84
+ params: { bs: true }
85
+ }],
86
+ parameters: {}
87
+ }]);
88
+ });
89
+ test("parseAcceptSignature(): preserves multiple parameters on one component", () => {
90
+ const result = parseAcceptSignature("sig1=(\"@request-response\";key=\"sig1\";req)");
91
+ deepStrictEqual(result, [{
92
+ label: "sig1",
93
+ components: [{
94
+ value: "@request-response",
95
+ params: {
96
+ key: "sig1",
97
+ req: true
98
+ }
99
+ }],
100
+ parameters: {}
101
+ }]);
102
+ });
103
+ test("parseAcceptSignature(): malformed header", () => {
104
+ deepStrictEqual(parseAcceptSignature("not a valid structured field"), []);
105
+ deepStrictEqual(parseAcceptSignature(""), []);
106
+ });
107
+ test("formatAcceptSignature(): single entry with created", () => {
108
+ const members = [{
109
+ label: "sig1",
110
+ components: [
111
+ {
112
+ value: "@method",
113
+ params: {}
114
+ },
115
+ {
116
+ value: "@target-uri",
117
+ params: {}
118
+ },
119
+ {
120
+ value: "@authority",
121
+ params: {}
122
+ }
123
+ ],
124
+ parameters: { created: true }
125
+ }];
126
+ const header = formatAcceptSignature(members);
127
+ const parsed = parseAcceptSignature(header);
128
+ deepStrictEqual(parsed, members);
129
+ });
130
+ test("formatAcceptSignature(): created + nonce", () => {
131
+ const members = [{
132
+ label: "sig1",
133
+ components: [{
134
+ value: "@method",
135
+ params: {}
136
+ }],
137
+ parameters: {
138
+ created: true,
139
+ nonce: "dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk"
140
+ }
141
+ }];
142
+ const header = formatAcceptSignature(members);
143
+ const parsed = parseAcceptSignature(header);
144
+ deepStrictEqual(parsed, members);
145
+ });
146
+ test("formatAcceptSignature(): multiple entries", () => {
147
+ const members = [{
148
+ label: "sig1",
149
+ components: [{
150
+ value: "@method",
151
+ params: {}
152
+ }],
153
+ parameters: {}
154
+ }, {
155
+ label: "sig2",
156
+ components: [{
157
+ value: "@authority",
158
+ params: {}
159
+ }, {
160
+ value: "content-digest",
161
+ params: {}
162
+ }],
163
+ parameters: { tag: "app-123" }
164
+ }];
165
+ const header = formatAcceptSignature(members);
166
+ const parsed = parseAcceptSignature(header);
167
+ deepStrictEqual(parsed, members);
168
+ });
169
+ test("formatAcceptSignature(): round-trip with all parameters", () => {
170
+ const input = [{
171
+ label: "sig1",
172
+ components: [
173
+ {
174
+ value: "@method",
175
+ params: {}
176
+ },
177
+ {
178
+ value: "@target-uri",
179
+ params: {}
180
+ },
181
+ {
182
+ value: "@authority",
183
+ params: {}
184
+ },
185
+ {
186
+ value: "content-digest",
187
+ params: {}
188
+ }
189
+ ],
190
+ parameters: {
191
+ keyid: "test-key-rsa-pss",
192
+ alg: "rsa-pss-sha512",
193
+ created: true,
194
+ expires: true,
195
+ nonce: "abc123",
196
+ tag: "app-123"
197
+ }
198
+ }];
199
+ const header = formatAcceptSignature(input);
200
+ const members = parseAcceptSignature(header);
201
+ deepStrictEqual(members, input);
202
+ });
203
+ test("formatAcceptSignature(): round-trip with parameterized components", () => {
204
+ const input = [{
205
+ label: "sig1",
206
+ components: [
207
+ {
208
+ value: "@query-param",
209
+ params: { name: "foo" }
210
+ },
211
+ {
212
+ value: "content-type",
213
+ params: { sf: true }
214
+ },
215
+ {
216
+ value: "@method",
217
+ params: {}
218
+ }
219
+ ],
220
+ parameters: { created: true }
221
+ }];
222
+ const header = formatAcceptSignature(input);
223
+ const members = parseAcceptSignature(header);
224
+ deepStrictEqual(members, input);
225
+ });
226
+ test("validateAcceptSignature(): filters out @status", () => {
227
+ const valid = {
228
+ label: "sig1",
229
+ components: [{
230
+ value: "@method",
231
+ params: {}
232
+ }, {
233
+ value: "@target-uri",
234
+ params: {}
235
+ }],
236
+ parameters: {}
237
+ };
238
+ const invalid = {
239
+ label: "sig2",
240
+ components: [{
241
+ value: "@method",
242
+ params: {}
243
+ }, {
244
+ value: "@status",
245
+ params: {}
246
+ }],
247
+ parameters: {}
248
+ };
249
+ const validOnly = [valid];
250
+ deepStrictEqual(validateAcceptSignature(validOnly), [valid]);
251
+ const invalidOnly = [invalid];
252
+ deepStrictEqual(validateAcceptSignature(invalidOnly), []);
253
+ const mixed = [valid, invalid];
254
+ deepStrictEqual(validateAcceptSignature(mixed), [valid]);
255
+ });
256
+ test("validateAcceptSignature(): passes entries with parameterized components", () => {
257
+ const members = [{
258
+ label: "sig1",
259
+ components: [{
260
+ value: "@query-param",
261
+ params: { name: "foo" }
262
+ }, {
263
+ value: "@method",
264
+ params: {}
265
+ }],
266
+ parameters: {}
267
+ }];
268
+ deepStrictEqual(validateAcceptSignature(members), members);
269
+ });
270
+ test("fulfillAcceptSignature(): compatible alg and keyid", () => {
271
+ const entry = {
272
+ label: "sig1",
273
+ components: [
274
+ {
275
+ value: "@method",
276
+ params: {}
277
+ },
278
+ {
279
+ value: "@target-uri",
280
+ params: {}
281
+ },
282
+ {
283
+ value: "content-digest",
284
+ params: {}
285
+ }
286
+ ],
287
+ parameters: {
288
+ alg: "rsa-v1_5-sha256",
289
+ keyid: "https://example.com/key",
290
+ nonce: "abc",
291
+ tag: "t1"
292
+ }
293
+ };
294
+ const result = fulfillAcceptSignature(entry, "https://example.com/key", "rsa-v1_5-sha256");
295
+ deepStrictEqual(result, {
296
+ label: "sig1",
297
+ components: [
298
+ {
299
+ value: "@method",
300
+ params: {}
301
+ },
302
+ {
303
+ value: "@target-uri",
304
+ params: {}
305
+ },
306
+ {
307
+ value: "content-digest",
308
+ params: {}
309
+ }
310
+ ],
311
+ nonce: "abc",
312
+ tag: "t1",
313
+ expires: void 0
314
+ });
315
+ });
316
+ test("fulfillAcceptSignature(): incompatible alg", () => {
317
+ const entry = {
318
+ label: "sig1",
319
+ components: [{
320
+ value: "@method",
321
+ params: {}
322
+ }],
323
+ parameters: { alg: "ecdsa-p256-sha256" }
324
+ };
325
+ const result = fulfillAcceptSignature(entry, "https://example.com/key", "rsa-v1_5-sha256");
326
+ strictEqual(result, null);
327
+ });
328
+ test("fulfillAcceptSignature(): incompatible keyid", () => {
329
+ const entry = {
330
+ label: "sig1",
331
+ components: [{
332
+ value: "@method",
333
+ params: {}
334
+ }],
335
+ parameters: { keyid: "https://other.example/key" }
336
+ };
337
+ const result = fulfillAcceptSignature(entry, "https://example.com/key", "rsa-v1_5-sha256");
338
+ strictEqual(result, null);
339
+ });
340
+ test("fulfillAcceptSignature(): components returned exactly as requested", () => {
341
+ const entry = {
342
+ label: "sig1",
343
+ components: [{
344
+ value: "content-digest",
345
+ params: {}
346
+ }],
347
+ parameters: {}
348
+ };
349
+ const result = fulfillAcceptSignature(entry, "https://example.com/key", "rsa-v1_5-sha256");
350
+ deepStrictEqual(result.components, [{
351
+ value: "content-digest",
352
+ params: {}
353
+ }]);
354
+ });
355
+ test("fulfillAcceptSignature(): no alg/keyid constraints", () => {
356
+ const entry = {
357
+ label: "custom",
358
+ components: [
359
+ {
360
+ value: "@method",
361
+ params: {}
362
+ },
363
+ {
364
+ value: "@target-uri",
365
+ params: {}
366
+ },
367
+ {
368
+ value: "@authority",
369
+ params: {}
370
+ }
371
+ ],
372
+ parameters: {}
373
+ };
374
+ const result = fulfillAcceptSignature(entry, "https://example.com/key", "rsa-v1_5-sha256");
375
+ deepStrictEqual(result, {
376
+ label: "custom",
377
+ components: [
378
+ {
379
+ value: "@method",
380
+ params: {}
381
+ },
382
+ {
383
+ value: "@target-uri",
384
+ params: {}
385
+ },
386
+ {
387
+ value: "@authority",
388
+ params: {}
389
+ }
390
+ ],
391
+ nonce: void 0,
392
+ tag: void 0,
393
+ expires: void 0
394
+ });
395
+ });
396
+ test("fulfillAcceptSignature(): passes through expires when requested", () => {
397
+ const entry = {
398
+ label: "sig1",
399
+ components: [
400
+ {
401
+ value: "@method",
402
+ params: {}
403
+ },
404
+ {
405
+ value: "@target-uri",
406
+ params: {}
407
+ },
408
+ {
409
+ value: "@authority",
410
+ params: {}
411
+ }
412
+ ],
413
+ parameters: { expires: true }
414
+ };
415
+ const result = fulfillAcceptSignature(entry, "https://example.com/key", "rsa-v1_5-sha256");
416
+ strictEqual(result != null, true);
417
+ strictEqual(result.expires, true);
418
+ });
419
+ test("fulfillAcceptSignature(): preserves component parameters in result", () => {
420
+ const entry = {
421
+ label: "sig1",
422
+ components: [
423
+ {
424
+ value: "@query-param",
425
+ params: { name: "foo" }
426
+ },
427
+ {
428
+ value: "@method",
429
+ params: {}
430
+ },
431
+ {
432
+ value: "@target-uri",
433
+ params: {}
434
+ },
435
+ {
436
+ value: "@authority",
437
+ params: {}
438
+ }
439
+ ],
440
+ parameters: {}
441
+ };
442
+ const result = fulfillAcceptSignature(entry, "https://example.com/key", "rsa-v1_5-sha256");
443
+ strictEqual(result != null, true);
444
+ const qp = result.components.find((c) => c.value === "@query-param");
445
+ deepStrictEqual(qp, {
446
+ value: "@query-param",
447
+ params: { name: "foo" }
448
+ });
449
+ });
450
+
451
+ //#endregion