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

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-B24i8eYp.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-OR506Yti.js} +1 -2
  10. package/dist/{docloader-CL1QPJzN.js → docloader-BG_pP2fW.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-Dm9n1mRe.js → http-BUCxbGks.js} +144 -49
  30. package/dist/{http-DsqqmkXi.d.cts → http-BudnHZE2.d.cts} +229 -1
  31. package/dist/{http-iDlaLy8a.cjs → http-CaXARmaJ.cjs} +307 -50
  32. package/dist/{http-BbfOqHGG.d.ts → http-Dax_FIBo.d.ts} +229 -1
  33. package/dist/{http-VpqmUjje.js → http-DePHjWKP.js} +278 -51
  34. package/dist/{inbox-CMtnW0RE.js → inbox-D_LU1opv.js} +1 -1
  35. package/dist/{key-B0yADkL8.js → key-Cx3Tx_In.js} +1 -1
  36. package/dist/{kv-cache-551Om14-.cjs → kv-cache-CYTDBChd.cjs} +1 -1
  37. package/dist/{kv-cache-BSATpUtX.js → kv-cache-DizRqYX4.js} +1 -1
  38. package/dist/{ld-BBmbv1nb.js → ld-CLMJw_iX.js} +3 -3
  39. package/dist/{middleware-Cx0tTbX1.js → middleware--uATyG9i.js} +95 -18
  40. package/dist/{middleware-DpdPMZII.js → middleware-4fo4pEtA.js} +4 -4
  41. package/dist/{middleware-D11GYoP-.cjs → middleware-9YDezkYJ.cjs} +94 -17
  42. package/dist/middleware-C2PqSUaA.js +27 -0
  43. package/dist/middleware-DNY45l5T.cjs +12 -0
  44. package/dist/{middleware-Cldp2YSv.js → middleware-DzICTgdC.js} +113 -34
  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-D5J299vd.js} +1 -1
  62. package/dist/{proof-wclcUq0C.js → proof-BBLHhWMC.js} +2 -2
  63. package/dist/{proof-CgK60TcQ.cjs → proof-BVl5IgbN.cjs} +3 -3
  64. package/dist/{proof-DnRq8s8f.js → proof-CiCp_mCG.js} +2 -2
  65. package/dist/{send-DNJyYRVU.js → send-2b0Fn9cn.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
@@ -7,30 +7,31 @@ import { assertEquals } from "../assert_equals-DSbWqCm3.js";
7
7
  import "../assert-MZs1qjMx.js";
8
8
  import "../assert_instance_of-DHz7EHNU.js";
9
9
  import { MemoryKvStore } from "../kv-QzKcOQgP.js";
10
- import "../deno-CEdy89j9.js";
11
- import { createFederation, handleNodeInfo, handleNodeInfoJrd } from "../middleware-Cldp2YSv.js";
10
+ import "../deno-OR506Yti.js";
11
+ import { createFederation, handleNodeInfo, handleNodeInfoJrd } from "../middleware-DzICTgdC.js";
12
12
  import "../client-CoCIaTNO.js";
13
13
  import "../router-D9eI0s4b.js";
14
14
  import "../types-CPz01LGH.js";
15
- import "../key-B0yADkL8.js";
16
- import "../http-Dm9n1mRe.js";
17
- import "../ld-BBmbv1nb.js";
18
- import "../owner-C1ZyG4NL.js";
19
- import "../proof-wclcUq0C.js";
20
- import "../docloader-CL1QPJzN.js";
21
- import "../kv-cache-El7We5sy.js";
22
- import "../inbox-CMtnW0RE.js";
23
- import "../builder-Deoi2N2z.js";
24
- import "../collection-CcnIw1qY.js";
25
- import "../keycache-C7k8s1Bk.js";
26
- import "../negotiation-5NPJL6zp.js";
27
- import "../retry-D4GJ670a.js";
28
- import "../send-DNJyYRVU.js";
29
- import "../std__assert-DWivtrGR.js";
30
- import "../assert_rejects-Ce45JcFg.js";
31
- import "../assert_throws-BNXdRGWP.js";
32
- import "../assert_not_equals-C80BG-_5.js";
33
- import { createRequestContext } from "../context-pa9aIrwp.js";
15
+ import "../accept-D7sAxyNa.js";
16
+ import "../key-Cx3Tx_In.js";
17
+ import "../http-BUCxbGks.js";
18
+ import "../ld-CLMJw_iX.js";
19
+ import "../owner-D5J299vd.js";
20
+ import "../proof-BBLHhWMC.js";
21
+ import "../docloader-BG_pP2fW.js";
22
+ import "../kv-cache-Bw2F2ABq.js";
23
+ import "../inbox-D_LU1opv.js";
24
+ import "../builder-B24i8eYp.js";
25
+ import "../collection-CSzG2j1P.js";
26
+ import "../keycache-CpGWAUbj.js";
27
+ import "../negotiation-BlAuS_nr.js";
28
+ import "../retry-mqLf4b-R.js";
29
+ import "../send-2b0Fn9cn.js";
30
+ import "../std__assert-X-_kMxKM.js";
31
+ import "../assert_rejects-0h7I2Esa.js";
32
+ import "../assert_throws-rjdMBf31.js";
33
+ import "../assert_not_equals-f3m3epl3.js";
34
+ import { createRequestContext } from "../context-Aqenou7c.js";
34
35
  import { test } from "@fedify/fixture";
35
36
 
36
37
  //#region src/nodeinfo/handler.test.ts
@@ -7,10 +7,10 @@ import { assertEquals } from "../assert_equals-DSbWqCm3.js";
7
7
  import "../assert-MZs1qjMx.js";
8
8
  import "../assert_instance_of-DHz7EHNU.js";
9
9
  import { nodeInfoToJson } from "../types-CPz01LGH.js";
10
- import "../std__assert-DWivtrGR.js";
11
- import "../assert_rejects-Ce45JcFg.js";
12
- import { assertThrows } from "../assert_throws-BNXdRGWP.js";
13
- import "../assert_not_equals-C80BG-_5.js";
10
+ import "../std__assert-X-_kMxKM.js";
11
+ import "../assert_rejects-0h7I2Esa.js";
12
+ import { assertThrows } from "../assert_throws-rjdMBf31.js";
13
+ import "../assert_not_equals-f3m3epl3.js";
14
14
  import { test } from "@fedify/fixture";
15
15
 
16
16
  //#region src/nodeinfo/types.test.ts
@@ -7,10 +7,10 @@ import { assertEquals } from "../assert_equals-DSbWqCm3.js";
7
7
  import "../assert-MZs1qjMx.js";
8
8
  import "../assert_instance_of-DHz7EHNU.js";
9
9
  import { MemoryKvStore } from "../kv-QzKcOQgP.js";
10
- import "../std__assert-DWivtrGR.js";
11
- import "../assert_rejects-Ce45JcFg.js";
12
- import "../assert_throws-BNXdRGWP.js";
13
- import "../assert_not_equals-C80BG-_5.js";
10
+ import "../std__assert-X-_kMxKM.js";
11
+ import "../assert_rejects-0h7I2Esa.js";
12
+ import "../assert_throws-rjdMBf31.js";
13
+ import "../assert_not_equals-f3m3epl3.js";
14
14
  import { test } from "@fedify/fixture";
15
15
  import { getLogger } from "@logtape/logtape";
16
16
  import { SpanKind, SpanStatusCode, TraceFlags } from "@opentelemetry/api";
@@ -3,7 +3,7 @@
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
  globalThis.addEventListener = () => {};
5
5
 
6
- import { deno_default } from "./deno-CEdy89j9.js";
6
+ import { deno_default } from "./deno-OR506Yti.js";
7
7
  import { CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
8
8
  import { getDocumentLoader } from "@fedify/vocab-runtime";
9
9
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
@@ -3,8 +3,8 @@
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
  globalThis.addEventListener = () => {};
5
5
 
6
- import { deno_default } from "./deno-CEdy89j9.js";
7
- import { fetchKey, validateCryptoKey } from "./key-B0yADkL8.js";
6
+ import { deno_default } from "./deno-OR506Yti.js";
7
+ import { fetchKey, validateCryptoKey } from "./key-Cx3Tx_In.js";
8
8
  import { Activity, DataIntegrityProof, Multikey, getTypeId } from "@fedify/vocab";
9
9
  import { getLogger } from "@logtape/logtape";
10
10
  import { SpanStatusCode, trace } from "@opentelemetry/api";
@@ -3,14 +3,14 @@
3
3
  const { URLPattern } = require("urlpattern-polyfill");
4
4
 
5
5
  const require_chunk = require('./chunk-CGaQZ11T.cjs');
6
- const require_http = require('./http-iDlaLy8a.cjs');
6
+ const require_http = require('./http-CaXARmaJ.cjs');
7
7
  const __logtape_logtape = require_chunk.__toESM(require("@logtape/logtape"));
8
8
  const __fedify_vocab = require_chunk.__toESM(require("@fedify/vocab"));
9
9
  const __opentelemetry_api = require_chunk.__toESM(require("@opentelemetry/api"));
10
10
  const byte_encodings_hex = require_chunk.__toESM(require("byte-encodings/hex"));
11
11
  const byte_encodings_base64 = require_chunk.__toESM(require("byte-encodings/base64"));
12
12
  const __fedify_vocab_runtime = require_chunk.__toESM(require("@fedify/vocab-runtime"));
13
- const jsonld = require_chunk.__toESM(require("jsonld"));
13
+ const __fedify_vocab_runtime_jsonld = require_chunk.__toESM(require("@fedify/vocab-runtime/jsonld"));
14
14
  const json_canon = require_chunk.__toESM(require("json-canon"));
15
15
 
16
16
  //#region src/sig/ld.ts
@@ -257,7 +257,7 @@ async function verifyJsonLd(jsonLd, options = {}) {
257
257
  });
258
258
  }
259
259
  async function hashJsonLd(jsonLd, contextLoader) {
260
- const canon = await jsonld.default.canonize(jsonLd, {
260
+ const canon = await __fedify_vocab_runtime_jsonld.default.canonize(jsonLd, {
261
261
  format: "application/n-quads",
262
262
  documentLoader: contextLoader ?? (0, __fedify_vocab_runtime.getDocumentLoader)()
263
263
  });
@@ -2,14 +2,14 @@
2
2
  import { Temporal } from "@js-temporal/polyfill";
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
 
5
- import { deno_default, fetchKey, validateCryptoKey } from "./http-VpqmUjje.js";
5
+ import { deno_default, fetchKey, validateCryptoKey } from "./http-DePHjWKP.js";
6
6
  import { getLogger } from "@logtape/logtape";
7
7
  import { Activity, CryptographicKey, DataIntegrityProof, Multikey, Object as Object$1, getTypeId, isActor } from "@fedify/vocab";
8
8
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
9
9
  import { encodeHex } from "byte-encodings/hex";
10
10
  import { decodeBase64, encodeBase64 } from "byte-encodings/base64";
11
11
  import { getDocumentLoader } from "@fedify/vocab-runtime";
12
- import jsonld from "jsonld";
12
+ import jsonld from "@fedify/vocab-runtime/jsonld";
13
13
  import serialize from "json-canon";
14
14
 
15
15
  //#region src/sig/ld.ts
@@ -3,8 +3,8 @@
3
3
  import { URLPattern } from "urlpattern-polyfill";
4
4
  globalThis.addEventListener = () => {};
5
5
 
6
- import { deno_default } from "./deno-CEdy89j9.js";
7
- import { doubleKnock } from "./http-Dm9n1mRe.js";
6
+ import { deno_default } from "./deno-OR506Yti.js";
7
+ import { doubleKnock } from "./http-BUCxbGks.js";
8
8
  import { getLogger } from "@logtape/logtape";
9
9
  import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
10
10
 
@@ -0,0 +1,3 @@
1
+ import { Temporal } from "@js-temporal/polyfill";
2
+ import { URLPattern } from "urlpattern-polyfill";
3
+ globalThis.addEventListener = () => {};
@@ -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