@fedify/fedify 0.10.0-dev.186 → 0.10.0-dev.190

Sign up to get free protection for your applications and to get access to all the features.
Files changed (157) hide show
  1. package/CHANGES.md +31 -0
  2. package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/mod.js +32 -21
  3. package/esm/federation/handler.js +3 -5
  4. package/esm/federation/middleware.js +115 -25
  5. package/esm/nodeinfo/types.js +1 -1
  6. package/esm/runtime/key.js +23 -3
  7. package/esm/sig/key.js +44 -16
  8. package/esm/testing/fixtures/example.com/key4 +7 -0
  9. package/esm/testing/fixtures/example.com/person2 +6 -0
  10. package/package.json +2 -1
  11. package/types/deps/jsr.io/@std/assert/0.226.0/assert.d.ts.map +1 -0
  12. package/types/deps/jsr.io/@std/assert/0.226.0/assertion_error.d.ts.map +1 -0
  13. package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/common.d.ts.map +1 -1
  14. package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/encoding.d.ts.map +1 -1
  15. package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/language.d.ts.map +1 -1
  16. package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/media_type.d.ts.map +1 -1
  17. package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/negotiation.d.ts +26 -21
  18. package/types/deps/jsr.io/@std/http/0.224.3/negotiation.d.ts.map +1 -0
  19. package/types/deps/jsr.io/@std/semver/0.224.2/_constants.d.ts.map +1 -0
  20. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_shared.d.ts.map +1 -1
  21. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_test_comparator_set.d.ts.map +1 -1
  22. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/can_parse.d.ts.map +1 -1
  23. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/compare.d.ts.map +1 -1
  24. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/constants.d.ts.map +1 -1
  25. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/difference.d.ts.map +1 -1
  26. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/equals.d.ts.map +1 -1
  27. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/format.d.ts.map +1 -1
  28. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/format_range.d.ts.map +1 -1
  29. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_or_equal.d.ts.map +1 -1
  30. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_than.d.ts.map +1 -1
  31. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_than_range.d.ts.map +1 -1
  32. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/increment.d.ts.map +1 -1
  33. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/is_range.d.ts.map +1 -1
  34. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/is_semver.d.ts.map +1 -1
  35. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_or_equal.d.ts.map +1 -1
  36. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_than.d.ts.map +1 -1
  37. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_than_range.d.ts.map +1 -1
  38. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/max_satisfying.d.ts.map +1 -1
  39. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/min_satisfying.d.ts.map +1 -1
  40. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/mod.d.ts +32 -21
  41. package/types/deps/jsr.io/@std/semver/0.224.2/mod.d.ts.map +1 -0
  42. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/not_equals.d.ts.map +1 -1
  43. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/parse.d.ts.map +1 -1
  44. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/parse_range.d.ts.map +1 -1
  45. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_intersects.d.ts.map +1 -1
  46. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_max.d.ts.map +1 -1
  47. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_min.d.ts.map +1 -1
  48. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/satisfies.d.ts.map +1 -1
  49. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/test_range.d.ts.map +1 -1
  50. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/try_parse.d.ts.map +1 -1
  51. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/try_parse_range.d.ts.map +1 -1
  52. package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/types.d.ts.map +1 -1
  53. package/types/deps/jsr.io/@std/text/{0.224.1 → 0.224.2}/_util.d.ts.map +1 -1
  54. package/types/deps/jsr.io/@std/text/0.224.2/case.d.ts.map +1 -0
  55. package/types/deps/jsr.io/@std/text/0.224.2/closest_string.d.ts.map +1 -0
  56. package/types/deps/jsr.io/@std/text/0.224.2/compare_similarity.d.ts.map +1 -0
  57. package/types/deps/jsr.io/@std/text/0.224.2/levenshtein_distance.d.ts.map +1 -0
  58. package/types/deps/jsr.io/@std/text/0.224.2/mod.d.ts.map +1 -0
  59. package/types/deps/jsr.io/@std/text/0.224.2/word_similarity_sort.d.ts.map +1 -0
  60. package/types/federation/callback.d.ts +16 -0
  61. package/types/federation/callback.d.ts.map +1 -1
  62. package/types/federation/context.d.ts +24 -2
  63. package/types/federation/context.d.ts.map +1 -1
  64. package/types/federation/handler.d.ts.map +1 -1
  65. package/types/federation/middleware.d.ts +14 -4
  66. package/types/federation/middleware.d.ts.map +1 -1
  67. package/types/nodeinfo/types.d.ts +1 -1
  68. package/types/runtime/key.d.ts +2 -0
  69. package/types/runtime/key.d.ts.map +1 -1
  70. package/types/sig/key.d.ts +5 -2
  71. package/types/sig/key.d.ts.map +1 -1
  72. package/types/testing/context.d.ts.map +1 -1
  73. package/types/testing/keys.d.ts.map +1 -1
  74. package/types/deps/jsr.io/@std/assert/0.225.3/assert.d.ts.map +0 -1
  75. package/types/deps/jsr.io/@std/assert/0.225.3/assertion_error.d.ts.map +0 -1
  76. package/types/deps/jsr.io/@std/http/0.224.2/negotiation.d.ts.map +0 -1
  77. package/types/deps/jsr.io/@std/semver/0.224.1/_constants.d.ts.map +0 -1
  78. package/types/deps/jsr.io/@std/semver/0.224.1/mod.d.ts.map +0 -1
  79. package/types/deps/jsr.io/@std/text/0.224.1/case.d.ts.map +0 -1
  80. package/types/deps/jsr.io/@std/text/0.224.1/closest_string.d.ts.map +0 -1
  81. package/types/deps/jsr.io/@std/text/0.224.1/compare_similarity.d.ts.map +0 -1
  82. package/types/deps/jsr.io/@std/text/0.224.1/levenshtein_distance.d.ts.map +0 -1
  83. package/types/deps/jsr.io/@std/text/0.224.1/mod.d.ts.map +0 -1
  84. package/types/deps/jsr.io/@std/text/0.224.1/word_similarity_sort.d.ts.map +0 -1
  85. /package/esm/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/common.js +0 -0
  86. /package/esm/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/encoding.js +0 -0
  87. /package/esm/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/language.js +0 -0
  88. /package/esm/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/media_type.js +0 -0
  89. /package/esm/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/negotiation.js +0 -0
  90. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_constants.js +0 -0
  91. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_shared.js +0 -0
  92. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_test_comparator_set.js +0 -0
  93. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/can_parse.js +0 -0
  94. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/compare.js +0 -0
  95. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/constants.js +0 -0
  96. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/difference.js +0 -0
  97. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/equals.js +0 -0
  98. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/format.js +0 -0
  99. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/format_range.js +0 -0
  100. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_or_equal.js +0 -0
  101. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_than.js +0 -0
  102. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_than_range.js +0 -0
  103. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/increment.js +0 -0
  104. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/is_range.js +0 -0
  105. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/is_semver.js +0 -0
  106. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_or_equal.js +0 -0
  107. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_than.js +0 -0
  108. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_than_range.js +0 -0
  109. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/max_satisfying.js +0 -0
  110. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/min_satisfying.js +0 -0
  111. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/not_equals.js +0 -0
  112. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/parse.js +0 -0
  113. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/parse_range.js +0 -0
  114. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_intersects.js +0 -0
  115. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_max.js +0 -0
  116. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_min.js +0 -0
  117. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/satisfies.js +0 -0
  118. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/test_range.js +0 -0
  119. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/try_parse.js +0 -0
  120. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/try_parse_range.js +0 -0
  121. /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/types.js +0 -0
  122. /package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/common.d.ts +0 -0
  123. /package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/encoding.d.ts +0 -0
  124. /package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/language.d.ts +0 -0
  125. /package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/media_type.d.ts +0 -0
  126. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_constants.d.ts +0 -0
  127. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_shared.d.ts +0 -0
  128. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_test_comparator_set.d.ts +0 -0
  129. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/can_parse.d.ts +0 -0
  130. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/compare.d.ts +0 -0
  131. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/constants.d.ts +0 -0
  132. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/difference.d.ts +0 -0
  133. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/equals.d.ts +0 -0
  134. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/format.d.ts +0 -0
  135. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/format_range.d.ts +0 -0
  136. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_or_equal.d.ts +0 -0
  137. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_than.d.ts +0 -0
  138. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_than_range.d.ts +0 -0
  139. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/increment.d.ts +0 -0
  140. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/is_range.d.ts +0 -0
  141. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/is_semver.d.ts +0 -0
  142. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_or_equal.d.ts +0 -0
  143. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_than.d.ts +0 -0
  144. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_than_range.d.ts +0 -0
  145. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/max_satisfying.d.ts +0 -0
  146. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/min_satisfying.d.ts +0 -0
  147. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/not_equals.d.ts +0 -0
  148. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/parse.d.ts +0 -0
  149. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/parse_range.d.ts +0 -0
  150. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_intersects.d.ts +0 -0
  151. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_max.d.ts +0 -0
  152. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_min.d.ts +0 -0
  153. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/satisfies.d.ts +0 -0
  154. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/test_range.d.ts +0 -0
  155. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/try_parse.d.ts +0 -0
  156. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/try_parse_range.d.ts +0 -0
  157. /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/types.d.ts +0 -0
package/CHANGES.md CHANGED
@@ -8,10 +8,41 @@ Version 0.10.0
8
8
 
9
9
  To be released.
10
10
 
11
+ - Besides RSA-PKCS#1-v1.5, Fedify now supports Ed25519 for signing and
12
+ verifying the activities. [[#55]]
13
+
14
+ - Added an optional parameter to `generateCryptoKeyPair()` function,
15
+ `algorithm`, which can be either `"RSASSA-PKCS1-v1_5"` or `"Ed25519"`.
16
+ - The `importJwk()` function now accepts Ed25519 keys.
17
+ - The `exportJwk()` function now exports Ed25519 keys.
18
+ - The `importSpki()` function now accepts Ed25519 keys.
19
+ - The `exportJwk()` function now exports Ed25519 keys.
20
+
21
+ - Now multiple key pairs can be registered for an actor.
22
+
23
+ - Added `Context.getActorKeyPairs()` method.
24
+ - Deprecated `Context.getActorKey()` method.
25
+ Use `Context.getActorKeyPairs()` method instead.
26
+ - Added `ActorKeyPair` interface.
27
+ - Added `ActorCallbackSetters.setKeyPairsDispatcher()` method.
28
+ - Added `ActorKeyPairsDispatcher` type.
29
+ - Deprecated `ActorCallbackSetters.setKeyPairDispatcher()` method.
30
+ - Deprecated `ActorKeyPairDispatcher` type.
31
+ - Deprecated the third parameter of the `ActorDispatcher` callback type.
32
+ Use `Context.getActorKeyPairs()` method instead.
33
+
11
34
  - Deprecated `treatHttps` option in `FederationParameters` interface.
12
35
  Instead, use the [x-forwarded-fetch] library to recognize the
13
36
  `X-Forwarded-Host` and `X-Forwarded-Proto` headers.
14
37
 
38
+ - Ephemeral actors and inboxes that the `fedify inbox` command spawns are
39
+ now more interoperable with other ActivityPub implementations.
40
+
41
+ - Ephemeral actors now have the following properties: `summary`,
42
+ `following`, `followers`, `outbox`, `manuallyApprovesFollowers`, and
43
+ `url`.
44
+
45
+ [#55]: https://github.com/dahlia/fedify/issues/55
15
46
  [x-forwarded-fetch]: https://github.com/dahlia/x-forwarded-fetch
16
47
 
17
48
 
@@ -2,10 +2,40 @@
2
2
  // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
3
3
  // This module is browser compatible.
4
4
  /**
5
- * The semantic version parser.
5
+ * The Semantic Version parser.
6
6
  *
7
7
  * Adapted directly from {@link https://github.com/npm/node-semver | semver}.
8
8
  *
9
+ * ```ts
10
+ * import {
11
+ * parse,
12
+ * parseRange,
13
+ * greaterThan,
14
+ * lessThan,
15
+ * format
16
+ * } from "@std/semver";
17
+ * import { assertEquals } from "@std/assert/assert-equals";
18
+ *
19
+ * const semver = parse("1.2.3");
20
+ * assertEquals(semver, {
21
+ * major: 1,
22
+ * minor: 2,
23
+ * patch: 3,
24
+ * prerelease: [],
25
+ * build: []
26
+ * });
27
+ *
28
+ * assertEquals(format(semver), "1.2.3");
29
+ *
30
+ * const range = parseRange("1.x || >=2.5.0 || 5.0.0 - 7.2.3");
31
+ *
32
+ * const s0 = parse("1.2.3");
33
+ * const s1 = parse("9.8.7");
34
+ *
35
+ * assertEquals(greaterThan(s0, s1), false);
36
+ * assertEquals(lessThan(s0, s1), true);
37
+ * ```
38
+ *
9
39
  * ## Versions
10
40
  *
11
41
  * A "version" is described by the `v2.0.0` specification found at
@@ -241,26 +271,7 @@
241
271
  *
242
272
  * This module is browser compatible.
243
273
  *
244
- * @example
245
- * ```ts
246
- * import {
247
- * parse,
248
- * parseRange,
249
- * greaterThan,
250
- * lessThan,
251
- * format
252
- * } from "@std/semver";
253
- *
254
- * const semver = parse("1.2.3");
255
- * const range = parseRange("1.x || >=2.5.0 || 5.0.0 - 7.2.3");
256
- *
257
- * const s0 = parse("1.2.3");
258
- * const s1 = parse("9.8.7");
259
- * greaterThan(s0, s1); // false
260
- * lessThan(s0, s1); // true
261
- *
262
- * format(semver) // "1.2.3"
263
- * ```
274
+
264
275
  *
265
276
  * @module
266
277
  */
@@ -1,6 +1,6 @@
1
1
  import * as dntShim from "../_dnt.shims.js";
2
2
  import { getLogger } from "@logtape/logtape";
3
- import { accepts } from "../deps/jsr.io/@std/http/0.224.2/negotiation.js";
3
+ import { accepts } from "../deps/jsr.io/@std/http/0.224.3/negotiation.js";
4
4
  import { verifyRequest } from "../sig/http.js";
5
5
  import { doesActorOwnKey } from "../sig/owner.js";
6
6
  import { Activity, Link, Object, OrderedCollection, OrderedCollectionPage, } from "../vocab/vocab.js";
@@ -18,8 +18,7 @@ export function acceptsJsonLd(request) {
18
18
  export async function handleActor(request, { handle, context, actorDispatcher, authorizePredicate, onNotFound, onNotAcceptable, onUnauthorized, }) {
19
19
  if (actorDispatcher == null)
20
20
  return await onNotFound(request);
21
- const key = await context.getActorKey(handle);
22
- const actor = await actorDispatcher(context, handle, key);
21
+ const actor = await context.getActor(handle);
23
22
  if (actor == null)
24
23
  return await onNotFound(request);
25
24
  if (!acceptsJsonLd(request))
@@ -170,8 +169,7 @@ export async function handleInbox(request, { handle, context, kv, kvPrefix, acto
170
169
  return await onNotFound(request);
171
170
  }
172
171
  else if (handle != null) {
173
- const key = await context.getActorKey(handle);
174
- const actor = await actorDispatcher(context, handle, key);
172
+ const actor = await context.getActor(handle);
175
173
  if (actor == null) {
176
174
  logger.error("Actor {handle} not found.", { handle });
177
175
  return await onNotFound(request);
@@ -145,6 +145,32 @@ export class Federation {
145
145
  }
146
146
  logger.info("Successfully sent activity {activityId} to {inbox}.", { ...logData, activityId: activity?.id?.href });
147
147
  }
148
+ async #getKeyPairsFromHandle(url, contextData, handle) {
149
+ const logger = getLogger(["fedify", "federation", "actor"]);
150
+ if (this.#actorCallbacks?.keyPairsDispatcher == null) {
151
+ throw new Error("No actor key pairs dispatcher registered.");
152
+ }
153
+ const path = this.#router.build("actor", { handle });
154
+ if (path == null) {
155
+ logger.warn("No actor dispatcher registered.");
156
+ return [];
157
+ }
158
+ const actorUri = new URL(path, url);
159
+ const keyPairs = await this.#actorCallbacks?.keyPairsDispatcher(contextData, handle);
160
+ if (keyPairs.length < 1) {
161
+ logger.warn("No key pairs found for actor {handle}.", { handle });
162
+ }
163
+ let i = 0;
164
+ const result = [];
165
+ for (const keyPair of keyPairs) {
166
+ result.push({
167
+ ...keyPair,
168
+ keyId: new URL(i == 0 ? `#main-key` : `#key-${i + 1}`, actorUri),
169
+ });
170
+ i++;
171
+ }
172
+ return result;
173
+ }
148
174
  createContext(urlOrRequest, contextData) {
149
175
  const request = urlOrRequest instanceof Request ? urlOrRequest : null;
150
176
  const url = urlOrRequest instanceof URL
@@ -157,26 +183,28 @@ export class Federation {
157
183
  }
158
184
  if (this.#treatHttps)
159
185
  url.protocol = "https:";
160
- const getKeyPairFromHandle = async (handle) => {
161
- if (this.#actorCallbacks?.keyPairDispatcher == null) {
162
- throw new Error("No actor key pair dispatcher registered.");
163
- }
164
- let keyPair = this.#actorCallbacks?.keyPairDispatcher(contextData, handle);
165
- if (keyPair instanceof Promise)
166
- keyPair = await keyPair;
167
- if (keyPair == null) {
168
- throw new Error(`No key pair found for actor ${JSON.stringify(handle)}`);
186
+ const getRsaKeyPairFromHandle = async (handle) => {
187
+ const keyPairs = await this.#getKeyPairsFromHandle(url, contextData, handle);
188
+ for (const keyPair of keyPairs) {
189
+ const { privateKey } = keyPair;
190
+ if (privateKey.algorithm.name === "RSASSA-PKCS1-v1_5" &&
191
+ privateKey.algorithm.hash
192
+ .name ===
193
+ "SHA-256") {
194
+ return keyPair;
195
+ }
169
196
  }
170
- return {
171
- keyId: new URL(`${context.getActorUri(handle)}#main-key`),
172
- privateKey: keyPair.privateKey,
173
- };
197
+ getLogger(["fedify", "federation", "actor"]).warn("No RSA-PKCS#1-v1.5 SHA-256 key found for actor {handle}.", { handle });
198
+ return null;
174
199
  };
175
200
  const getAuthenticatedDocumentLoader = this.#authenticatedDocumentLoaderFactory;
201
+ const documentLoader = this.#documentLoader;
176
202
  function getDocumentLoader(identity) {
177
203
  if ("handle" in identity) {
178
- const keyPair = getKeyPairFromHandle(identity.handle);
179
- return keyPair.then((pair) => getAuthenticatedDocumentLoader(pair));
204
+ const keyPair = getRsaKeyPairFromHandle(identity.handle);
205
+ if (keyPair == null)
206
+ return documentLoader;
207
+ return keyPair.then((pair) => pair == null ? documentLoader : getAuthenticatedDocumentLoader(pair));
180
208
  }
181
209
  return getAuthenticatedDocumentLoader(identity);
182
210
  }
@@ -294,23 +322,62 @@ export class Federation {
294
322
  return result.handle;
295
323
  return null;
296
324
  },
325
+ getActorKeyPairs: async (handle) => {
326
+ let keyPairs;
327
+ try {
328
+ keyPairs = await this.#getKeyPairsFromHandle(url, contextData, handle);
329
+ }
330
+ catch (_) {
331
+ getLogger(["fedify", "federation", "actor"])
332
+ .warn("No actor key pairs dispatcher registered.");
333
+ return [];
334
+ }
335
+ const owner = context.getActorUri(handle);
336
+ const result = [];
337
+ for (const keyPair of keyPairs) {
338
+ const newPair = {
339
+ ...keyPair,
340
+ cryptographicKey: new CryptographicKey({
341
+ id: keyPair.keyId,
342
+ owner,
343
+ publicKey: keyPair.publicKey,
344
+ }),
345
+ };
346
+ result.push(newPair);
347
+ }
348
+ return result;
349
+ },
297
350
  getActorKey: async (handle) => {
298
- let keyPair = this.#actorCallbacks?.keyPairDispatcher?.(contextData, handle);
299
- if (keyPair instanceof Promise)
300
- keyPair = await keyPair;
351
+ getLogger(["fedify", "federation", "actor"]).warn("Context.getActorKey() method is deprecated; " +
352
+ "use Context.getActorKeyPairs() method instead.");
353
+ let keyPair;
354
+ try {
355
+ keyPair = await getRsaKeyPairFromHandle(handle);
356
+ }
357
+ catch (_) {
358
+ return null;
359
+ }
301
360
  if (keyPair == null)
302
361
  return null;
303
362
  return new CryptographicKey({
304
- id: new URL(`${context.getActorUri(handle)}#main-key`),
363
+ id: keyPair.keyId,
305
364
  owner: context.getActorUri(handle),
306
365
  publicKey: keyPair.publicKey,
307
366
  });
308
367
  },
309
368
  getDocumentLoader,
310
369
  sendActivity: async (sender, recipients, activity, options = {}) => {
311
- const senderPair = "handle" in sender
312
- ? await getKeyPairFromHandle(sender.handle)
313
- : sender;
370
+ let senderPair;
371
+ if ("handle" in sender) {
372
+ const keyPair = await getRsaKeyPairFromHandle(sender.handle);
373
+ if (keyPair == null) {
374
+ throw new Error(`No key pair found for actor ${sender.handle}`);
375
+ }
376
+ senderPair = keyPair;
377
+ }
378
+ else {
379
+ senderPair = sender;
380
+ }
314
381
  const opts = { ...options };
315
382
  let expandedRecipients;
316
383
  if (Array.isArray(recipients)) {
@@ -349,6 +416,13 @@ export class Federation {
349
416
  this.#actorCallbacks.dispatcher == null) {
350
417
  throw new Error("No actor dispatcher registered.");
351
418
  }
419
+ let rsaKey;
420
+ try {
421
+ rsaKey = await getRsaKeyPairFromHandle(handle);
422
+ }
423
+ catch (_) {
424
+ rsaKey = null;
425
+ }
352
426
  return await this.#actorCallbacks.dispatcher({
353
427
  ...reqCtx,
354
428
  getActor(handle2) {
@@ -357,7 +431,11 @@ export class Federation {
357
431
  "this may cause an infinite loop.", { getActorHandle: handle2, actorDispatcherHandle: handle });
358
432
  return reqCtx.getActor(handle2);
359
433
  },
360
- }, handle, await context.getActorKey(handle));
434
+ }, handle, rsaKey == null ? null : new CryptographicKey({
435
+ id: rsaKey.keyId,
436
+ owner: context.getActorUri(handle),
437
+ publicKey: rsaKey.publicKey,
438
+ }));
361
439
  },
362
440
  getObject: async (cls, values) => {
363
441
  const callbacks = this.#objectCallbacks[cls.typeId.href];
@@ -431,7 +509,7 @@ export class Federation {
431
509
  * ``` typescript
432
510
  * federation.setActorDispatcher(
433
511
  * "/users/{handle}",
434
- * async (ctx, handle, key) => {
512
+ * async (ctx, handle) => {
435
513
  * return new Person({
436
514
  * id: ctx.getActorUri(handle),
437
515
  * preferredUsername: handle,
@@ -531,8 +609,20 @@ export class Federation {
531
609
  };
532
610
  this.#actorCallbacks = callbacks;
533
611
  const setters = {
612
+ setKeyPairsDispatcher(dispatcher) {
613
+ callbacks.keyPairsDispatcher = dispatcher;
614
+ return setters;
615
+ },
534
616
  setKeyPairDispatcher(dispatcher) {
535
- callbacks.keyPairDispatcher = dispatcher;
617
+ getLogger(["fedify", "federation", "actor"]).warn("The ActorCallbackSetters.setKeyPairDispatcher() method is " +
618
+ "deprecated. Use the ActorCallbackSetters.setKeyPairsDispatcher() " +
619
+ "instead.");
620
+ callbacks.keyPairsDispatcher = async (ctxData, handle) => {
621
+ const key = await dispatcher(ctxData, handle);
622
+ if (key == null)
623
+ return [];
624
+ return [key];
625
+ };
536
626
  return setters;
537
627
  },
538
628
  authorize(predicate) {
@@ -1,4 +1,4 @@
1
- import { format } from "../deps/jsr.io/@std/semver/0.224.1/mod.js";
1
+ import { format } from "../deps/jsr.io/@std/semver/0.224.2/mod.js";
2
2
  /**
3
3
  * Converts a {@link NodeInfo} object to a JSON value.
4
4
  * @param nodeInfo The {@link NodeInfo} object to convert.
@@ -1,24 +1,44 @@
1
1
  import * as dntShim from "../_dnt.shims.js";
2
2
  import { decodeBase64, encodeBase64 } from "../deps/jsr.io/@std/encoding/0.224.3/base64.js";
3
+ import { PublicKeyInfo } from "pkijs";
4
+ import { validateCryptoKey } from "../sig/key.js";
5
+ const algorithms = {
6
+ "1.2.840.113549.1.1.1": { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" },
7
+ "1.3.101.112": "Ed25519",
8
+ };
3
9
  /**
4
10
  * Imports a PEM-SPKI formatted public key.
5
11
  * @param pem The PEM-SPKI formatted public key.
6
12
  * @returns The imported public key.
13
+ * @throws {TypeError} If the key is invalid or unsupported.
7
14
  * @since 0.5.0
8
15
  */
9
16
  export async function importSpki(pem) {
10
17
  pem = pem.replace(/(?:-----(?:BEGIN|END) PUBLIC KEY-----|\s)/g, "");
11
- const spki = decodeBase64(pem);
12
- // TODO: support other than RSASSA-PKCS1-v1_5:
13
- return await dntShim.crypto.subtle.importKey("spki", spki, { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, true, ["verify"]);
18
+ let spki;
19
+ try {
20
+ spki = decodeBase64(pem);
21
+ }
22
+ catch (_) {
23
+ throw new TypeError("Invalid PEM-SPKI format.");
24
+ }
25
+ const pki = PublicKeyInfo.fromBER(spki);
26
+ const oid = pki.algorithm.algorithmId;
27
+ const algorithm = algorithms[oid];
28
+ if (algorithm == null) {
29
+ throw new TypeError("Unsupported algorithm: " + oid);
30
+ }
31
+ return await dntShim.crypto.subtle.importKey("spki", spki, algorithm, true, ["verify"]);
14
32
  }
15
33
  /**
16
34
  * Exports a public key in PEM-SPKI format.
17
35
  * @param key The public key to export.
18
36
  * @returns The exported public key in PEM-SPKI format.
37
+ * @throws {TypeError} If the key is invalid or unsupported.
19
38
  * @since 0.5.0
20
39
  */
21
40
  export async function exportSpki(key) {
41
+ validateCryptoKey(key);
22
42
  const spki = await dntShim.crypto.subtle.exportKey("spki", key);
23
43
  let pem = encodeBase64(spki);
24
44
  pem = (pem.match(/.{1,64}/g) || []).join("\n");
package/esm/sig/key.js CHANGED
@@ -1,3 +1,5 @@
1
+ import * as dntShim from "../_dnt.shims.js";
2
+ import { getLogger } from "@logtape/logtape";
1
3
  /**
2
4
  * Checks if the given key is valid and supported. No-op if the key is valid,
3
5
  * otherwise throws an error.
@@ -6,7 +8,6 @@
6
8
  * either public or private.
7
9
  * @throws {TypeError} If the key is invalid or unsupported.
8
10
  */
9
- import * as dntShim from "../_dnt.shims.js";
10
11
  export function validateCryptoKey(key, type) {
11
12
  if (type != null && key.type !== type) {
12
13
  throw new TypeError(`The key is not a ${type} key.`);
@@ -14,28 +15,46 @@ export function validateCryptoKey(key, type) {
14
15
  if (!key.extractable) {
15
16
  throw new TypeError("The key is not extractable.");
16
17
  }
17
- if (key.algorithm.name != "RSASSA-PKCS1-v1_5") {
18
- throw new TypeError("Currently only RSASSA-PKCS1-v1_5 key is supported. " +
18
+ if (key.algorithm.name !== "RSASSA-PKCS1-v1_5" &&
19
+ key.algorithm.name !== "Ed25519") {
20
+ throw new TypeError("Currently only RSASSA-PKCS1-v1_5 and Ed25519 keys are supported. " +
19
21
  "More algorithms will be added in the future!");
20
22
  }
21
- // @ts-ignore TS2304
22
- const algorithm = key.algorithm;
23
- if (algorithm.hash.name != "SHA-256") {
24
- throw new TypeError("For compatibility with the existing Fediverse software " +
25
- "(e.g., Mastodon), hash algorithm must be SHA-256.");
23
+ if (key.algorithm.name === "RSASSA-PKCS1-v1_5") {
24
+ // @ts-ignore TS2304
25
+ const algorithm = key.algorithm;
26
+ if (algorithm.hash.name !== "SHA-256") {
27
+ throw new TypeError("For compatibility with the existing Fediverse software " +
28
+ "(e.g., Mastodon), hash algorithm for RSASSA-PKCS1-v1_5 keys " +
29
+ "must be SHA-256.");
30
+ }
26
31
  }
27
32
  }
28
33
  /**
29
34
  * Generates a key pair which is appropriate for Fedify.
35
+ * @param algorithm The algorithm to use. Currently only RSASSA-PKCS1-v1_5 and
36
+ * Ed25519 are supported.
30
37
  * @returns The generated key pair.
38
+ * @throws {TypeError} If the algorithm is unsupported.
31
39
  */
32
- export function generateCryptoKeyPair() {
33
- return dntShim.crypto.subtle.generateKey({
34
- name: "RSASSA-PKCS1-v1_5",
35
- modulusLength: 4096,
36
- publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
37
- hash: "SHA-256",
38
- }, true, ["sign", "verify"]);
40
+ export function generateCryptoKeyPair(algorithm) {
41
+ if (algorithm == null) {
42
+ getLogger(["fedify", "sig", "key"]).warn("No algorithm specified. Using RSASSA-PKCS1-v1_5 by default, but " +
43
+ "it is recommended to specify the algorithm explicitly as " +
44
+ "the parameter will be required in the future.");
45
+ }
46
+ if (algorithm == null || algorithm === "RSASSA-PKCS1-v1_5") {
47
+ return dntShim.crypto.subtle.generateKey({
48
+ name: "RSASSA-PKCS1-v1_5",
49
+ modulusLength: 4096,
50
+ publicExponent: new Uint8Array([0x01, 0x00, 0x01]),
51
+ hash: "SHA-256",
52
+ }, true, ["sign", "verify"]);
53
+ }
54
+ else if (algorithm === "Ed25519") {
55
+ return dntShim.crypto.subtle.generateKey("Ed25519", true, ["sign", "verify"]);
56
+ }
57
+ throw new TypeError("Unsupported algorithm: " + algorithm);
39
58
  }
40
59
  /**
41
60
  * Exports a key in JWK format.
@@ -56,7 +75,16 @@ export async function exportJwk(key) {
56
75
  * @throws {TypeError} If the key is invalid or unsupported.
57
76
  */
58
77
  export async function importJwk(jwk, type) {
59
- const key = await dntShim.crypto.subtle.importKey("jwk", jwk, { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, true, type === "public" ? ["verify"] : ["sign"]);
78
+ let key;
79
+ if (jwk.kty === "RSA" && jwk.alg === "RS256") {
80
+ key = await dntShim.crypto.subtle.importKey("jwk", jwk, { name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" }, true, type === "public" ? ["verify"] : ["sign"]);
81
+ }
82
+ else if (jwk.kty === "OKP" && jwk.crv === "Ed25519") {
83
+ key = await dntShim.crypto.subtle.importKey("jwk", jwk, "Ed25519", true, type === "public" ? ["verify"] : ["sign"]);
84
+ }
85
+ else {
86
+ throw new TypeError("Unsupported JWK format.");
87
+ }
60
88
  validateCryptoKey(key, type);
61
89
  return key;
62
90
  }
@@ -0,0 +1,7 @@
1
+ {
2
+ "@context": "https://w3id.org/security/v1",
3
+ "id": "https://example.com/key4",
4
+ "type": "CryptographicKey",
5
+ "owner": "https://example.com/person2",
6
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEALR8epAGDe+cVq5p2Tx49CCfphpk1rNhkNoY9i+XEUfg=\n-----END PUBLIC KEY-----\n"
7
+ }
@@ -12,6 +12,12 @@
12
12
  "type": "CryptographicKey",
13
13
  "owner": "https://example.com/person2",
14
14
  "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4GUqWgdiYlN3Su5Gr4l6\ni+xRS8gDDVKZ718vpGk6eIpvqs33q430nRbHIzbHRXRaAhc/1++rUBcK0V4/kjZl\nCSzVtRgGU6HMkmjcD+uE56a8XbTczfltbEDj7afoEuB2F3UhQEWrSz+QJ29DPXaL\nMIa1Yv61NR2vxGqNbdtoMjDORMBYtg77CYbcFkiJHw65PDa7+f/yjLxuCRPye5L7\nhncN0UZuuFoRJmHNRLSg5omBad9WTvQXmSyXEhEdk9fHwlI022AqAzlWbT79hldc\nDSKGGLLbQIs1c3JZIG8G5i6Uh5Vy0Z7tSNBcxbhqoI9i9je4f/x/OPIVc19f04BE\n1LgWuHsftZzRgW9Sdqz53W83XxVdxlyHeywXOnstSWT11f8dkLyQUcHKTH+E6urb\nH+aiPLiRpYK8W7D9KTQA9kZ5JXaEuveBd5vJX7wakhbzAn8pWJU7GYIHNY38Ycok\nmivkU5pY8S2cKFMwY0b7ade3MComlir5P3ZYSjF+n6gRVsT96P+9mNfCu9gXt/f8\nXCyjKlH89kGwuJ7HhR8CuVdm0l+jYozVt6GsDy0hHYyn79NCCAEzP7ZbhBMR0T5V\nrkl+TIGXoJH9WFiz4VxO+NnglF6dNQjDS5IzYLoFRXIK1f3cmQiEB4FZmL70l9HL\nrgwR+Xys83xia79OqFDRezMCAwEAAQ==\n-----END PUBLIC KEY-----\n"
15
+ },
16
+ {
17
+ "id": "https://example.com/key4",
18
+ "type": "CryptographicKey",
19
+ "owner": "https://example.com/person2",
20
+ "publicKeyPem": "-----BEGIN PUBLIC KEY-----\nMCowBQYDK2VwAyEALR8epAGDe+cVq5p2Tx49CCfphpk1rNhkNoY9i+XEUfg=\n-----END PUBLIC KEY-----\n"
15
21
  }
16
22
  ]
17
23
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fedify/fedify",
3
- "version": "0.10.0-dev.186+95c4a49c",
3
+ "version": "0.10.0-dev.190+4dffb89a",
4
4
  "description": "An ActivityPub server framework",
5
5
  "keywords": [
6
6
  "ActivityPub",
@@ -85,6 +85,7 @@
85
85
  "@logtape/logtape": "^0.4.0",
86
86
  "@phensley/language-tag": "^1.8.0",
87
87
  "jsonld": "^8.3.2",
88
+ "pkijs": "^3.1.0",
88
89
  "uri-template-router": "^0.0.16",
89
90
  "url-template": "^3.1.1",
90
91
  "@deno/shim-deno": "~0.18.0",
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../../../../../src/deps/jsr.io/@std/assert/0.226.0/assert.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,SAAK,GAAG,OAAO,CAAC,IAAI,CAI5D"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assertion_error.d.ts","sourceRoot":"","sources":["../../../../../../src/deps/jsr.io/@std/assert/0.226.0/assertion_error.ts"],"names":[],"mappings":"AAGA;;;;;;;;;GASG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC;;;;;;;;;;OAUG;gBACS,OAAO,EAAE,MAAM;CAI5B"}
@@ -1 +1 @@
1
- {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../../../../src/deps/jsr.io/@std/http/0.224.2/_negotiation/common.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,MAAM,CAQnE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAEpD"}
1
+ {"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../../../../src/deps/jsr.io/@std/http/0.224.3/_negotiation/common.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,MAAM,WAAW,WAAW;IAC1B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,CAAC,EAAE,MAAM,CAAC;IACX,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,CAAC,EAAE,MAAM,CAAC;CACZ;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,WAAW,GAAG,MAAM,CAQnE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAEpD"}
@@ -1 +1 @@
1
- {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../../../../../../src/deps/jsr.io/@std/http/0.224.2/_negotiation/encoding.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AA4GH;;qCAEqC;AACrC,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,MAAM,EAAE,CAkBV"}
1
+ {"version":3,"file":"encoding.d.ts","sourceRoot":"","sources":["../../../../../../../src/deps/jsr.io/@std/http/0.224.3/_negotiation/encoding.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AA4GH;;qCAEqC;AACrC,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,MAAM,EAAE,CAkBV"}
@@ -1 +1 @@
1
- {"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../../../../../../../src/deps/jsr.io/@std/http/0.224.2/_negotiation/language.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAkGH,wBAAgB,kBAAkB,CAChC,MAAM,SAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,MAAM,EAAE,CAiBV"}
1
+ {"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../../../../../../../src/deps/jsr.io/@std/http/0.224.3/_negotiation/language.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAkGH,wBAAgB,kBAAkB,CAChC,MAAM,SAAM,EACZ,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,MAAM,EAAE,CAiBV"}
@@ -1 +1 @@
1
- {"version":3,"file":"media_type.d.ts","sourceRoot":"","sources":["../../../../../../../src/deps/jsr.io/@std/http/0.224.2/_negotiation/media_type.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAiJH,wBAAgB,mBAAmB,CACjC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,MAAM,EAAE,CAkBV"}
1
+ {"version":3,"file":"media_type.d.ts","sourceRoot":"","sources":["../../../../../../../src/deps/jsr.io/@std/http/0.224.3/_negotiation/media_type.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAiJH,wBAAgB,mBAAmB,CACjC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EACtB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,MAAM,EAAE,CAkBV"}