@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.
- package/CHANGES.md +31 -0
- package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/mod.js +32 -21
- package/esm/federation/handler.js +3 -5
- package/esm/federation/middleware.js +115 -25
- package/esm/nodeinfo/types.js +1 -1
- package/esm/runtime/key.js +23 -3
- package/esm/sig/key.js +44 -16
- package/esm/testing/fixtures/example.com/key4 +7 -0
- package/esm/testing/fixtures/example.com/person2 +6 -0
- package/package.json +2 -1
- package/types/deps/jsr.io/@std/assert/0.226.0/assert.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/assert/0.226.0/assertion_error.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/common.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/encoding.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/language.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/media_type.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/negotiation.d.ts +26 -21
- package/types/deps/jsr.io/@std/http/0.224.3/negotiation.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/semver/0.224.2/_constants.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_shared.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_test_comparator_set.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/can_parse.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/compare.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/constants.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/difference.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/equals.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/format.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/format_range.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_or_equal.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_than.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_than_range.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/increment.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/is_range.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/is_semver.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_or_equal.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_than.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_than_range.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/max_satisfying.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/min_satisfying.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/mod.d.ts +32 -21
- package/types/deps/jsr.io/@std/semver/0.224.2/mod.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/not_equals.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/parse.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/parse_range.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_intersects.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_max.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_min.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/satisfies.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/test_range.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/try_parse.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/try_parse_range.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/types.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/text/{0.224.1 → 0.224.2}/_util.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/text/0.224.2/case.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/text/0.224.2/closest_string.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/text/0.224.2/compare_similarity.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/text/0.224.2/levenshtein_distance.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/text/0.224.2/mod.d.ts.map +1 -0
- package/types/deps/jsr.io/@std/text/0.224.2/word_similarity_sort.d.ts.map +1 -0
- package/types/federation/callback.d.ts +16 -0
- package/types/federation/callback.d.ts.map +1 -1
- package/types/federation/context.d.ts +24 -2
- package/types/federation/context.d.ts.map +1 -1
- package/types/federation/handler.d.ts.map +1 -1
- package/types/federation/middleware.d.ts +14 -4
- package/types/federation/middleware.d.ts.map +1 -1
- package/types/nodeinfo/types.d.ts +1 -1
- package/types/runtime/key.d.ts +2 -0
- package/types/runtime/key.d.ts.map +1 -1
- package/types/sig/key.d.ts +5 -2
- package/types/sig/key.d.ts.map +1 -1
- package/types/testing/context.d.ts.map +1 -1
- package/types/testing/keys.d.ts.map +1 -1
- package/types/deps/jsr.io/@std/assert/0.225.3/assert.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/assert/0.225.3/assertion_error.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/http/0.224.2/negotiation.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/semver/0.224.1/_constants.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/semver/0.224.1/mod.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/text/0.224.1/case.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/text/0.224.1/closest_string.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/text/0.224.1/compare_similarity.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/text/0.224.1/levenshtein_distance.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/text/0.224.1/mod.d.ts.map +0 -1
- package/types/deps/jsr.io/@std/text/0.224.1/word_similarity_sort.d.ts.map +0 -1
- /package/esm/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/common.js +0 -0
- /package/esm/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/encoding.js +0 -0
- /package/esm/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/language.js +0 -0
- /package/esm/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/media_type.js +0 -0
- /package/esm/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/negotiation.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_constants.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_shared.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_test_comparator_set.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/can_parse.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/compare.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/constants.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/difference.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/equals.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/format.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/format_range.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_or_equal.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_than.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_than_range.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/increment.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/is_range.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/is_semver.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_or_equal.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_than.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_than_range.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/max_satisfying.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/min_satisfying.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/not_equals.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/parse.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/parse_range.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_intersects.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_max.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_min.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/satisfies.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/test_range.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/try_parse.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/try_parse_range.js +0 -0
- /package/esm/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/types.js +0 -0
- /package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/common.d.ts +0 -0
- /package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/encoding.d.ts +0 -0
- /package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/language.d.ts +0 -0
- /package/types/deps/jsr.io/@std/http/{0.224.2 → 0.224.3}/_negotiation/media_type.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_constants.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_shared.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/_test_comparator_set.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/can_parse.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/compare.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/constants.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/difference.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/equals.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/format.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/format_range.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_or_equal.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_than.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/greater_than_range.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/increment.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/is_range.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/is_semver.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_or_equal.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_than.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/less_than_range.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/max_satisfying.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/min_satisfying.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/not_equals.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/parse.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/parse_range.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_intersects.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_max.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/range_min.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/satisfies.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/test_range.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/try_parse.d.ts +0 -0
- /package/types/deps/jsr.io/@std/semver/{0.224.1 → 0.224.2}/try_parse_range.d.ts +0 -0
- /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
|
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
|
-
|
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.
|
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
|
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
|
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
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
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
|
-
|
171
|
-
|
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 =
|
179
|
-
|
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
|
-
|
299
|
-
|
300
|
-
|
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:
|
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
|
-
|
312
|
-
|
313
|
-
|
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,
|
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
|
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
|
-
|
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) {
|
package/esm/nodeinfo/types.js
CHANGED
package/esm/runtime/key.js
CHANGED
@@ -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
|
-
|
12
|
-
|
13
|
-
|
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
|
18
|
-
|
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
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
"
|
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
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
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
|
-
|
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.
|
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.
|
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.
|
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.
|
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.
|
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"}
|