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

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 (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"}