@fedify/fedify 2.1.1 → 2.1.3
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.
- package/dist/{accept-D7sAxyNa.js → accept-Dd__NiUL.mjs} +10 -8
- package/dist/{assert-MZs1qjMx.js → assert-ddO5KLpe.mjs} +5 -9
- package/dist/{assert_equals-DSbWqCm3.js → assert_equals-Ew3jOFa3.mjs} +55 -69
- package/dist/{assert_instance_of-DHz7EHNU.js → assert_instance_of-C4Ri6VuN.mjs} +5 -9
- package/dist/{assert_not_equals-f3m3epl3.js → assert_not_equals--wG9hV7u.mjs} +6 -13
- package/dist/{assert_rejects-0h7I2Esa.js → assert_rejects-B-qJtC9Z.mjs} +6 -11
- package/dist/{assert_throws-rjdMBf31.js → assert_throws-4NwKEy2q.mjs} +5 -10
- package/dist/{builder-DbKYZdSy.js → builder-BKo51w-F.mjs} +32 -41
- package/dist/{chunk-CGaQZ11T.cjs → chunk-DDcVe30Y.cjs} +23 -24
- package/dist/{chunk-DJNbSFdH.js → chunk-nlSIicah.js} +8 -8
- package/dist/{client-BxMZiQaD.d.ts → client-AtlibPOU.d.ts} +1 -1
- package/dist/{client-CoCIaTNO.js → client-DEpOVgY1.mjs} +9 -13
- package/dist/{client-C97KOq3x.d.cts → client-z-8dc-e1.d.cts} +1 -1
- package/dist/{collection-CSzG2j1P.js → collection-BD6-SZ6O.mjs} +7 -12
- package/dist/compat/mod.cjs +5 -8
- package/dist/compat/mod.d.cts +78 -6
- package/dist/compat/mod.d.ts +78 -6
- package/dist/compat/mod.js +4 -8
- package/dist/compat/transformers.test.mjs +62 -0
- package/dist/{context-DyJjQQ_H.d.ts → context-BOiMZBu5.d.ts} +9 -18
- package/dist/{context-BcqA-0BL.d.cts → context-BhZVy7RB.d.cts} +9 -18
- package/dist/{context-Aqenou7c.js → context-Juj6bdHC.mjs} +7 -11
- package/dist/deno-D5r_9RvZ.mjs +8 -0
- package/dist/{docloader-Ck0SCLXX.js → docloader-B9CXCw8i.mjs} +8 -14
- package/dist/{esm-nLm00z9V.js → esm-DVILvP5e.mjs} +50 -89
- package/dist/federation/builder.test.d.mts +2 -0
- package/dist/federation/{builder.test.js → builder.test.mjs} +21 -44
- package/dist/federation/collection.test.d.mts +2 -0
- package/dist/federation/collection.test.mjs +21 -0
- package/dist/federation/handler.test.d.mts +2 -0
- package/dist/federation/{handler.test.js → handler.test.mjs} +69 -131
- package/dist/federation/idempotency.test.d.mts +2 -0
- package/dist/federation/{idempotency.test.js → idempotency.test.mjs} +31 -63
- package/dist/federation/inbox.test.d.mts +2 -0
- package/dist/federation/{inbox.test.js → inbox.test.mjs} +8 -12
- package/dist/federation/keycache.test.d.mts +2 -0
- package/dist/federation/{keycache.test.js → keycache.test.mjs} +13 -19
- package/dist/federation/kv.test.d.mts +2 -0
- package/dist/federation/{kv.test.js → kv.test.mjs} +11 -22
- package/dist/federation/middleware.test.d.mts +2 -0
- package/dist/federation/{middleware.test.js → middleware.test.mjs} +173 -262
- package/dist/federation/mod.cjs +327 -16
- package/dist/federation/mod.d.cts +3 -6
- package/dist/federation/mod.d.ts +3 -6
- package/dist/federation/mod.js +322 -13
- package/dist/federation/mq.test.d.mts +2 -0
- package/dist/federation/{mq.test.js → mq.test.mjs} +21 -35
- package/dist/federation/negotiation.test.d.mts +2 -0
- package/dist/federation/{negotiation.test.js → negotiation.test.mjs} +9 -16
- package/dist/federation/retry.test.d.mts +2 -0
- package/dist/federation/{retry.test.js → retry.test.mjs} +8 -11
- package/dist/federation/router.test.d.mts +2 -0
- package/dist/federation/{router.test.js → router.test.mjs} +11 -16
- package/dist/federation/send.test.d.mts +2 -0
- package/dist/federation/{send.test.js → send.test.mjs} +22 -30
- package/dist/federation/webfinger.test.d.mts +2 -0
- package/dist/federation/{webfinger.test.js → webfinger.test.mjs} +22 -56
- package/dist/{http-DFzT4YFG.js → http-B53alCGi.mjs} +23 -43
- package/dist/{http-ca2xny58.cjs → http-BngkmEhl.cjs} +177 -302
- package/dist/{http-BudnHZE2.d.cts → http-CrGuipxe.d.cts} +1 -6
- package/dist/{http-EUQ6crVa.js → http-PS3wuU8D.js} +53 -184
- package/dist/{http-Dax_FIBo.d.ts → http-aQzN9Ayi.d.ts} +1 -6
- package/dist/{inbox-BMLz_-pL.js → inbox-CHsLu5ai.mjs} +18 -26
- package/dist/{key-CypuWa94.js → key-D9Np_ZXl.mjs} +29 -37
- package/dist/{keycache-CpGWAUbj.js → keycache-CCSwkQcY.mjs} +5 -10
- package/dist/{keys-BFve7QQv.js → keys-BAK-tUlf.mjs} +5 -9
- package/dist/{kv-BL4nlICN.d.cts → kv-CbLNp3zQ.d.cts} +1 -1
- package/dist/{kv-DXEUEP6z.d.ts → kv-GFYnFoOl.d.ts} +1 -1
- package/dist/{kv-cache-Bw2F2ABq.js → kv-cache-B01V7s3h.mjs} +4 -8
- package/dist/{kv-cache-SKgbvvu4.js → kv-cache-B2Qi5MGv.js} +6 -13
- package/dist/{kv-cache-BBJFLMW5.cjs → kv-cache-YCtINZK4.cjs} +27 -34
- package/dist/{kv-QzKcOQgP.js → kv-tL2TOE9X.mjs} +6 -10
- package/dist/{ld-CXLtTc0G.js → ld-BaxRFhDd.mjs} +17 -31
- package/dist/{middleware-CL6XaAFy.cjs → middleware-Bsv-7iX7.cjs} +532 -587
- package/dist/middleware-C37OmOz_.mjs +5 -0
- package/dist/middleware-CelV2xrI.cjs +4 -0
- package/dist/{middleware-CvS6hWm3.js → middleware-Dn1kk96N.js} +335 -382
- package/dist/{middleware-BHJ0xm0L.js → middleware-dFn6ozt5.mjs} +282 -317
- package/dist/{mod-Bx9jcLB8.d.cts → mod-B505FZBC.d.cts} +3 -3
- package/dist/{mod-em2Il1eD.d.cts → mod-Bp_CzKd4.d.cts} +2 -2
- package/dist/{mod-Cs2dYEwI.d.ts → mod-D7PAuO6k.d.ts} +3 -3
- package/dist/{mod-D6MdymW7.d.ts → mod-DKOAow7a.d.ts} +2 -2
- package/dist/{mod-Coe7KEgX.d.cts → mod-DoJBjjnO.d.cts} +2 -2
- package/dist/{mod-D6dOd--H.d.ts → mod-DvxszxXC.d.ts} +2 -2
- package/dist/mod.cjs +29 -74
- package/dist/mod.d.cts +11 -14
- package/dist/mod.d.ts +11 -15
- package/dist/mod.js +17 -71
- package/dist/{negotiation-BlAuS_nr.js → negotiation-DnsfFF8I.mjs} +7 -11
- package/dist/nodeinfo/client.test.d.mts +2 -0
- package/dist/nodeinfo/{client.test.js → client.test.mjs} +22 -40
- package/dist/nodeinfo/handler.test.d.mts +2 -0
- package/dist/nodeinfo/{handler.test.js → handler.test.mjs} +13 -43
- package/dist/nodeinfo/mod.cjs +5 -8
- package/dist/nodeinfo/mod.d.cts +2 -3
- package/dist/nodeinfo/mod.d.ts +2 -3
- package/dist/nodeinfo/mod.js +4 -8
- package/dist/nodeinfo/types.test.d.mts +2 -0
- package/dist/nodeinfo/{types.test.js → types.test.mjs} +9 -16
- package/dist/otel/exporter.test.d.mts +2 -0
- package/dist/otel/{exporter.test.js → exporter.test.mjs} +124 -178
- package/dist/otel/mod.cjs +15 -20
- package/dist/otel/mod.d.cts +2 -2
- package/dist/otel/mod.d.ts +2 -2
- package/dist/otel/mod.js +8 -14
- package/dist/{owner-gd0Q9FuU.d.ts → owner-74ARJ5TL.d.ts} +1 -1
- package/dist/{owner-1AbPBOOZ.d.cts → owner-CptqhsOy.d.cts} +1 -1
- package/dist/{owner-CwMai3jn.js → owner-dxM51u36.mjs} +11 -16
- package/dist/{proof-ZuJBOUoi.js → proof-CH5U0k7G.mjs} +21 -33
- package/dist/{proof-sCID81Ua.cjs → proof-D39qiki3.cjs} +133 -157
- package/dist/{proof-6Zw1FW7t.js → proof-Dpgqx9RS.js} +32 -58
- package/dist/{retry-mqLf4b-R.js → retry-B_E3V_Dx.mjs} +4 -7
- package/dist/{router-D9eI0s4b.js → router-CrMLXoOr.mjs} +4 -8
- package/dist/runtime/mod.cjs +11 -13
- package/dist/runtime/mod.d.cts +6 -2
- package/dist/runtime/mod.d.ts +0 -1
- package/dist/runtime/mod.js +4 -7
- package/dist/{send-BW73dy6Q.js → send-D1-4ZnQq.mjs} +8 -13
- package/dist/sig/accept.test.d.mts +2 -0
- package/dist/sig/{accept.test.js → accept.test.mjs} +35 -70
- package/dist/sig/http.test.d.mts +2 -0
- package/dist/sig/{http.test.js → http.test.mjs} +166 -280
- package/dist/sig/key.test.d.mts +2 -0
- package/dist/sig/{key.test.js → key.test.mjs} +11 -18
- package/dist/sig/ld.test.d.mts +2 -0
- package/dist/sig/{ld.test.js → ld.test.mjs} +22 -35
- package/dist/sig/mod.cjs +6 -9
- package/dist/sig/mod.d.cts +3 -3
- package/dist/sig/mod.d.ts +3 -3
- package/dist/sig/mod.js +5 -9
- package/dist/sig/owner.test.d.mts +2 -0
- package/dist/sig/{owner.test.js → owner.test.mjs} +19 -34
- package/dist/sig/proof.test.d.mts +2 -0
- package/dist/sig/{proof.test.js → proof.test.mjs} +16 -27
- package/dist/{std__assert-X-_kMxKM.js → std__assert-Duiq_YC9.mjs} +12 -24
- package/dist/testing/{mod.d.ts → mod.d.mts} +26 -90
- package/dist/testing/mod.mjs +6 -0
- package/dist/{transformers-3g8GZwkZ.cjs → transformers-NeAONrAq.cjs} +20 -25
- package/dist/{transformers-C3FLHUd6.js → transformers-ve6e2xcg.js} +3 -7
- package/dist/{types-CPz01LGH.js → types-DCP0WLdt.mjs} +4 -7
- package/dist/{types-Cd_hszr_.cjs → types-KC4QAoxe.cjs} +29 -34
- package/dist/{types-C93Ob9cU.js → types-hvL8ElAs.js} +8 -13
- package/dist/utils/docloader.test.d.mts +2 -0
- package/dist/utils/{docloader.test.js → docloader.test.mjs} +14 -25
- package/dist/utils/kv-cache.test.d.mts +2 -0
- package/dist/utils/{kv-cache.test.js → kv-cache.test.mjs} +25 -40
- package/dist/utils/mod.cjs +5 -9
- package/dist/utils/mod.d.cts +1 -3
- package/dist/utils/mod.d.ts +1 -3
- package/dist/utils/mod.js +4 -9
- package/dist/vocab/cjs.test.d.mts +2 -0
- package/dist/vocab/cjs.test.mjs +14 -0
- package/dist/vocab/mod.cjs +10 -12
- package/dist/vocab/mod.js +3 -5
- package/package.json +8 -8
- package/dist/compat/transformers.test.d.ts +0 -3
- package/dist/compat/transformers.test.js +0 -88
- package/dist/compat-Bb4NuTUO.js +0 -4
- package/dist/compat-DmDDELst.cjs +0 -4
- package/dist/deno-DH972JvX.js +0 -121
- package/dist/federation/builder.test.d.ts +0 -3
- package/dist/federation/collection.test.d.ts +0 -3
- package/dist/federation/collection.test.js +0 -32
- package/dist/federation/handler.test.d.ts +0 -3
- package/dist/federation/idempotency.test.d.ts +0 -3
- package/dist/federation/inbox.test.d.ts +0 -3
- package/dist/federation/keycache.test.d.ts +0 -3
- package/dist/federation/kv.test.d.ts +0 -3
- package/dist/federation/middleware.test.d.ts +0 -3
- package/dist/federation/mq.test.d.ts +0 -3
- package/dist/federation/negotiation.test.d.ts +0 -3
- package/dist/federation/retry.test.d.ts +0 -3
- package/dist/federation/router.test.d.ts +0 -3
- package/dist/federation/send.test.d.ts +0 -3
- package/dist/federation/webfinger.test.d.ts +0 -3
- package/dist/federation-Bp3HI26G.cjs +0 -350
- package/dist/federation-DaMfqRm4.js +0 -332
- package/dist/middleware-B8FJuMM0.js +0 -27
- package/dist/middleware-BVp930fR.js +0 -12
- package/dist/middleware-BvGP-uXy.cjs +0 -12
- package/dist/mod-B7QkWzrL.d.cts +0 -80
- package/dist/mod-Bh8mqlYw.d.cts +0 -9
- package/dist/mod-D6HodEq7.d.ts +0 -7
- package/dist/mod-SMHOMNpZ.d.ts +0 -82
- package/dist/mod-gq_Xfdz8.d.cts +0 -1
- package/dist/nodeinfo/client.test.d.ts +0 -3
- package/dist/nodeinfo/handler.test.d.ts +0 -3
- package/dist/nodeinfo/types.test.d.ts +0 -3
- package/dist/nodeinfo-DoESQxq5.js +0 -4
- package/dist/nodeinfo-DuMYTpbZ.cjs +0 -4
- package/dist/otel/exporter.test.d.ts +0 -3
- package/dist/runtime-c2Njxsry.cjs +0 -17
- package/dist/runtime-poamPCMb.js +0 -13
- package/dist/sig/accept.test.d.ts +0 -3
- package/dist/sig/http.test.d.ts +0 -3
- package/dist/sig/key.test.d.ts +0 -3
- package/dist/sig/ld.test.d.ts +0 -3
- package/dist/sig/owner.test.d.ts +0 -3
- package/dist/sig/proof.test.d.ts +0 -3
- package/dist/sig-BNhspNOf.js +0 -4
- package/dist/sig-vX39WyWI.cjs +0 -4
- package/dist/testing/mod.js +0 -10
- package/dist/utils/docloader.test.d.ts +0 -3
- package/dist/utils/kv-cache.test.d.ts +0 -3
- package/dist/utils-BQ9KqEK9.cjs +0 -4
- package/dist/utils-Dn5OPdSW.js +0 -4
- /package/dist/{mod-AGjRfPjT.d.ts → compat/transformers.test.d.mts} +0 -0
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { deno_default } from "./deno-DH972JvX.js";
|
|
1
|
+
import "@js-temporal/polyfill";
|
|
2
|
+
import "urlpattern-polyfill";
|
|
3
|
+
globalThis.addEventListener = () => {};
|
|
4
|
+
import { n as version, t as name } from "./deno-D5r_9RvZ.mjs";
|
|
7
5
|
import { CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
|
|
6
|
+
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
8
7
|
import { FetchError, getDocumentLoader } from "@fedify/vocab-runtime";
|
|
9
8
|
import { getLogger } from "@logtape/logtape";
|
|
10
|
-
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
11
|
-
|
|
12
9
|
//#region src/sig/key.ts
|
|
13
10
|
/**
|
|
14
11
|
* Checks if the given key is valid and supported. No-op if the key is valid,
|
|
@@ -23,8 +20,7 @@ function validateCryptoKey(key, type) {
|
|
|
23
20
|
if (!key.extractable) throw new TypeError("The key is not extractable.");
|
|
24
21
|
if (key.algorithm.name !== "RSASSA-PKCS1-v1_5" && key.algorithm.name !== "Ed25519") throw new TypeError("Currently only RSASSA-PKCS1-v1_5 and Ed25519 keys are supported. More algorithms will be added in the future!");
|
|
25
22
|
if (key.algorithm.name === "RSASSA-PKCS1-v1_5") {
|
|
26
|
-
|
|
27
|
-
if (algorithm.hash.name !== "SHA-256") throw new TypeError("For compatibility with the existing Fediverse software (e.g., Mastodon), hash algorithm for RSASSA-PKCS1-v1_5 keys must be SHA-256.");
|
|
23
|
+
if (key.algorithm.hash.name !== "SHA-256") throw new TypeError("For compatibility with the existing Fediverse software (e.g., Mastodon), hash algorithm for RSASSA-PKCS1-v1_5 keys must be SHA-256.");
|
|
28
24
|
}
|
|
29
25
|
}
|
|
30
26
|
/**
|
|
@@ -91,8 +87,7 @@ async function importJwk(jwk, type) {
|
|
|
91
87
|
}
|
|
92
88
|
async function withFetchKeySpan(keyId, tracerProvider, fetcher) {
|
|
93
89
|
tracerProvider ??= trace.getTracerProvider();
|
|
94
|
-
|
|
95
|
-
return await tracer.startActiveSpan("activitypub.fetch_key", {
|
|
90
|
+
return await tracerProvider.getTracer(name, version).startActiveSpan("activitypub.fetch_key", {
|
|
96
91
|
kind: SpanKind.CLIENT,
|
|
97
92
|
attributes: {
|
|
98
93
|
"http.method": "GET",
|
|
@@ -153,41 +148,41 @@ function fetchKey(keyId, cls, options = {}) {
|
|
|
153
148
|
async function fetchKeyDetailed(keyId, cls, options = {}) {
|
|
154
149
|
const cacheKey = typeof keyId === "string" ? new URL(keyId) : keyId;
|
|
155
150
|
return await withFetchKeySpan(cacheKey, options.tracerProvider, async () => {
|
|
156
|
-
return await fetchKeyWithResult(cacheKey, cls, options, async (cacheKey
|
|
157
|
-
const fetchError = await keyCache?.getFetchError?.(cacheKey
|
|
151
|
+
return await fetchKeyWithResult(cacheKey, cls, options, async (cacheKey, keyId, keyCache, logger) => {
|
|
152
|
+
const fetchError = await keyCache?.getFetchError?.(cacheKey);
|
|
158
153
|
if (fetchError != null) {
|
|
159
|
-
logger.debug("Entry {keyId} found in cache with preserved fetch failure details.", { keyId
|
|
154
|
+
logger.debug("Entry {keyId} found in cache with preserved fetch failure details.", { keyId });
|
|
160
155
|
return {
|
|
161
156
|
key: null,
|
|
162
157
|
cached: true,
|
|
163
158
|
fetchError
|
|
164
159
|
};
|
|
165
160
|
}
|
|
166
|
-
logger.debug("Entry {keyId} found in cache, but no fetch failure details are available.", { keyId
|
|
161
|
+
logger.debug("Entry {keyId} found in cache, but no fetch failure details are available.", { keyId });
|
|
167
162
|
return {
|
|
168
163
|
key: null,
|
|
169
164
|
cached: true
|
|
170
165
|
};
|
|
171
|
-
}, async (error, cacheKey
|
|
166
|
+
}, async (error, cacheKey, keyId, keyCache, logger) => {
|
|
172
167
|
logger.debug("Failed to fetch key {keyId}.", {
|
|
173
|
-
keyId
|
|
168
|
+
keyId,
|
|
174
169
|
error
|
|
175
170
|
});
|
|
176
|
-
await keyCache?.set(cacheKey
|
|
171
|
+
await keyCache?.set(cacheKey, null);
|
|
177
172
|
if (error instanceof FetchError && error.response != null) {
|
|
178
|
-
const fetchError
|
|
173
|
+
const fetchError = {
|
|
179
174
|
status: error.response.status,
|
|
180
175
|
response: error.response.clone()
|
|
181
176
|
};
|
|
182
|
-
await keyCache?.setFetchError?.(cacheKey
|
|
177
|
+
await keyCache?.setFetchError?.(cacheKey, fetchError);
|
|
183
178
|
return {
|
|
184
179
|
key: null,
|
|
185
180
|
cached: false,
|
|
186
|
-
fetchError
|
|
181
|
+
fetchError
|
|
187
182
|
};
|
|
188
183
|
}
|
|
189
184
|
const fetchError = { error: error instanceof Error ? error : new Error(String(error)) };
|
|
190
|
-
await keyCache?.setFetchError?.(cacheKey
|
|
185
|
+
await keyCache?.setFetchError?.(cacheKey, fetchError);
|
|
191
186
|
return {
|
|
192
187
|
key: null,
|
|
193
188
|
cached: false,
|
|
@@ -233,8 +228,8 @@ async function resolveFetchedKey(document, cacheKey, keyId, cls, { documentLoade
|
|
|
233
228
|
contextLoader,
|
|
234
229
|
tracerProvider
|
|
235
230
|
});
|
|
236
|
-
} catch (e
|
|
237
|
-
if (e
|
|
231
|
+
} catch (e) {
|
|
232
|
+
if (e instanceof TypeError) {
|
|
238
233
|
logger.debug("Failed to verify; key {keyId} returned an invalid object.", { keyId });
|
|
239
234
|
await keyCache?.set(cacheKey, null);
|
|
240
235
|
await clearFetchErrorMetadata(cacheKey, keyCache);
|
|
@@ -243,7 +238,7 @@ async function resolveFetchedKey(document, cacheKey, keyId, cls, { documentLoade
|
|
|
243
238
|
cached: false
|
|
244
239
|
};
|
|
245
240
|
}
|
|
246
|
-
throw e
|
|
241
|
+
throw e;
|
|
247
242
|
}
|
|
248
243
|
}
|
|
249
244
|
let key = null;
|
|
@@ -324,37 +319,34 @@ async function fetchKeyWithResult(cacheKey, cls, options, onCachedUnavailable, o
|
|
|
324
319
|
logger.debug("Fetching key {keyId} to verify signature...", { keyId });
|
|
325
320
|
let document;
|
|
326
321
|
try {
|
|
327
|
-
|
|
328
|
-
document = remoteDocument.document;
|
|
322
|
+
document = (await (options.documentLoader ?? getDocumentLoader())(keyId)).document;
|
|
329
323
|
} catch (error) {
|
|
330
324
|
return await onFetchError(error, cacheKey, keyId, keyCache, logger);
|
|
331
325
|
}
|
|
332
326
|
return await resolveFetchedKey(document, cacheKey, keyId, cls, options, logger);
|
|
333
327
|
}
|
|
334
328
|
async function fetchKeyInternal(keyId, cls, options = {}) {
|
|
335
|
-
|
|
336
|
-
return await fetchKeyWithResult(cacheKey, cls, options, (_cacheKey, _keyId, _keyCache, _logger) => {
|
|
329
|
+
return await fetchKeyWithResult(typeof keyId === "string" ? new URL(keyId) : keyId, cls, options, (_cacheKey, _keyId, _keyCache, _logger) => {
|
|
337
330
|
return {
|
|
338
331
|
key: null,
|
|
339
332
|
cached: true
|
|
340
333
|
};
|
|
341
|
-
}, async (error, cacheKey
|
|
334
|
+
}, async (error, cacheKey, keyId, keyCache, logger) => {
|
|
342
335
|
logger.debug("Failed to fetch key {keyId}.", {
|
|
343
|
-
keyId
|
|
336
|
+
keyId,
|
|
344
337
|
error
|
|
345
338
|
});
|
|
346
|
-
await keyCache?.set(cacheKey
|
|
347
|
-
if (error instanceof FetchError && error.response != null) await keyCache?.setFetchError?.(cacheKey
|
|
339
|
+
await keyCache?.set(cacheKey, null);
|
|
340
|
+
if (error instanceof FetchError && error.response != null) await keyCache?.setFetchError?.(cacheKey, {
|
|
348
341
|
status: error.response.status,
|
|
349
342
|
response: error.response.clone()
|
|
350
343
|
});
|
|
351
|
-
else await keyCache?.setFetchError?.(cacheKey
|
|
344
|
+
else await keyCache?.setFetchError?.(cacheKey, { error: error instanceof Error ? error : new Error(String(error)) });
|
|
352
345
|
return {
|
|
353
346
|
key: null,
|
|
354
347
|
cached: false
|
|
355
348
|
};
|
|
356
349
|
});
|
|
357
350
|
}
|
|
358
|
-
|
|
359
351
|
//#endregion
|
|
360
|
-
export {
|
|
352
|
+
export { importJwk as a, generateCryptoKeyPair as i, fetchKey as n, validateCryptoKey as o, fetchKeyDetailed as r, exportJwk as t };
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
globalThis.addEventListener = () => {};
|
|
5
|
-
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import "urlpattern-polyfill";
|
|
3
|
+
globalThis.addEventListener = () => {};
|
|
6
4
|
import { CryptographicKey, Multikey } from "@fedify/vocab";
|
|
7
|
-
|
|
8
5
|
//#region src/federation/keycache.ts
|
|
9
6
|
var KvKeyCache = class {
|
|
10
7
|
kv;
|
|
@@ -45,7 +42,7 @@ var KvKeyCache = class {
|
|
|
45
42
|
return await Multikey.fromJsonLd(serialized, this.options);
|
|
46
43
|
} catch {
|
|
47
44
|
await this.kv.delete([...this.prefix, keyId.href]);
|
|
48
|
-
return
|
|
45
|
+
return;
|
|
49
46
|
}
|
|
50
47
|
}
|
|
51
48
|
}
|
|
@@ -75,7 +72,6 @@ var KvKeyCache = class {
|
|
|
75
72
|
error.name = cached.errorName;
|
|
76
73
|
return { error };
|
|
77
74
|
}
|
|
78
|
-
return void 0;
|
|
79
75
|
}
|
|
80
76
|
async setFetchError(keyId, error) {
|
|
81
77
|
if (error == null) {
|
|
@@ -97,6 +93,5 @@ var KvKeyCache = class {
|
|
|
97
93
|
}, { ttl: this.unavailableKeyTtl });
|
|
98
94
|
}
|
|
99
95
|
};
|
|
100
|
-
|
|
101
96
|
//#endregion
|
|
102
|
-
export { KvKeyCache };
|
|
97
|
+
export { KvKeyCache as t };
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
globalThis.addEventListener = () => {};
|
|
5
|
-
|
|
1
|
+
import "@js-temporal/polyfill";
|
|
2
|
+
import "urlpattern-polyfill";
|
|
3
|
+
globalThis.addEventListener = () => {};
|
|
6
4
|
import { CryptographicKey, Multikey } from "@fedify/vocab";
|
|
7
5
|
import { importSpki } from "@fedify/vocab-runtime";
|
|
8
|
-
|
|
9
6
|
//#region src/testing/keys.ts
|
|
10
7
|
const rsaPublicKey1 = new CryptographicKey({
|
|
11
8
|
id: new URL("https://example.com/key"),
|
|
@@ -85,7 +82,7 @@ const rsaPublicKey3 = new CryptographicKey({
|
|
|
85
82
|
"hash": "SHA-256"
|
|
86
83
|
}, true, ["verify"])
|
|
87
84
|
});
|
|
88
|
-
|
|
85
|
+
new Multikey({
|
|
89
86
|
id: new URL("https://example.com/person2#key3"),
|
|
90
87
|
controller: new URL("https://example.com/person2"),
|
|
91
88
|
publicKey: rsaPublicKey3.publicKey
|
|
@@ -119,6 +116,5 @@ const ed25519Multikey = new Multikey({
|
|
|
119
116
|
controller: new URL("https://example.com/person2"),
|
|
120
117
|
publicKey: ed25519PublicKey.publicKey
|
|
121
118
|
});
|
|
122
|
-
|
|
123
119
|
//#endregion
|
|
124
|
-
export {
|
|
120
|
+
export { rsaPrivateKey3 as a, rsaPublicKey3 as c, rsaPrivateKey2 as i, rsaPublicKey5 as l, ed25519PrivateKey as n, rsaPublicKey1 as o, ed25519PublicKey as r, rsaPublicKey2 as s, ed25519Multikey as t };
|
|
@@ -107,4 +107,4 @@ declare class MemoryKvStore implements KvStore {
|
|
|
107
107
|
list(prefix?: KvKey): AsyncIterable<KvStoreListEntry>;
|
|
108
108
|
}
|
|
109
109
|
//#endregion
|
|
110
|
-
export {
|
|
110
|
+
export { MemoryKvStore as a, KvStoreSetOptions as i, KvStore as n, KvStoreListEntry as r, KvKey as t };
|
|
@@ -110,4 +110,4 @@ declare class MemoryKvStore implements KvStore {
|
|
|
110
110
|
list(prefix?: KvKey): AsyncIterable<KvStoreListEntry>;
|
|
111
111
|
}
|
|
112
112
|
//#endregion
|
|
113
|
-
export {
|
|
113
|
+
export { MemoryKvStore as a, KvStoreSetOptions as i, KvStore as n, KvStoreListEntry as r, KvKey as t };
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
globalThis.addEventListener = () => {};
|
|
5
|
-
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import { URLPattern } from "urlpattern-polyfill";
|
|
3
|
+
globalThis.addEventListener = () => {};
|
|
6
4
|
import { preloadedContexts } from "@fedify/vocab-runtime";
|
|
7
5
|
import { getLogger } from "@logtape/logtape";
|
|
8
|
-
|
|
9
6
|
//#region src/utils/kv-cache.ts
|
|
10
7
|
const logger = getLogger([
|
|
11
8
|
"fedify",
|
|
@@ -102,6 +99,5 @@ function matchRule(url, rules) {
|
|
|
102
99
|
}
|
|
103
100
|
return null;
|
|
104
101
|
}
|
|
105
|
-
|
|
106
102
|
//#endregion
|
|
107
|
-
export {
|
|
103
|
+
export { kvCache as n, MockKvStore as t };
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import { doubleKnock, validateCryptoKey } from "./http-EUQ6crVa.js";
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import { URLPattern } from "urlpattern-polyfill";
|
|
3
|
+
import { d as validateCryptoKey, t as doubleKnock } from "./http-PS3wuU8D.js";
|
|
6
4
|
import { getLogger } from "@logtape/logtape";
|
|
7
5
|
import { curry } from "es-toolkit";
|
|
8
6
|
import { UrlError, createActivityPubRequest, getRemoteDocument, logRequest, preloadedContexts, validatePublicUrl } from "@fedify/vocab-runtime";
|
|
9
|
-
|
|
10
7
|
//#region src/utils/docloader.ts
|
|
11
8
|
const logger$1 = getLogger([
|
|
12
9
|
"fedify",
|
|
@@ -36,18 +33,15 @@ function getAuthenticatedDocumentLoader(identity, { allowPrivateAddress, userAge
|
|
|
36
33
|
});
|
|
37
34
|
throw error;
|
|
38
35
|
}
|
|
39
|
-
|
|
40
|
-
const response = await doubleKnock(originalRequest, identity, {
|
|
36
|
+
return getRemoteDocument(url, await doubleKnock(createActivityPubRequest(url, { userAgent }), identity, {
|
|
41
37
|
specDeterminer,
|
|
42
38
|
log: curry(logRequest)(logger$1),
|
|
43
39
|
tracerProvider,
|
|
44
40
|
signal: options?.signal
|
|
45
|
-
});
|
|
46
|
-
return getRemoteDocument(url, response, load);
|
|
41
|
+
}), load);
|
|
47
42
|
}
|
|
48
43
|
return load;
|
|
49
44
|
}
|
|
50
|
-
|
|
51
45
|
//#endregion
|
|
52
46
|
//#region src/utils/kv-cache.ts
|
|
53
47
|
const logger = getLogger([
|
|
@@ -115,6 +109,5 @@ function matchRule(url, rules) {
|
|
|
115
109
|
}
|
|
116
110
|
return null;
|
|
117
111
|
}
|
|
118
|
-
|
|
119
112
|
//#endregion
|
|
120
|
-
export { getAuthenticatedDocumentLoader, kvCache };
|
|
113
|
+
export { getAuthenticatedDocumentLoader as n, kvCache as t };
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
const es_toolkit = require_chunk.__toESM(require("es-toolkit"));
|
|
9
|
-
const __fedify_vocab_runtime = require_chunk.__toESM(require("@fedify/vocab-runtime"));
|
|
10
|
-
|
|
1
|
+
const { Temporal } = require("@js-temporal/polyfill");
|
|
2
|
+
const { URLPattern } = require("urlpattern-polyfill");
|
|
3
|
+
require("./chunk-DDcVe30Y.cjs");
|
|
4
|
+
const require_http = require("./http-BngkmEhl.cjs");
|
|
5
|
+
let _logtape_logtape = require("@logtape/logtape");
|
|
6
|
+
let es_toolkit = require("es-toolkit");
|
|
7
|
+
let _fedify_vocab_runtime = require("@fedify/vocab-runtime");
|
|
11
8
|
//#region src/utils/docloader.ts
|
|
12
|
-
const logger$1 = (0,
|
|
9
|
+
const logger$1 = (0, _logtape_logtape.getLogger)([
|
|
13
10
|
"fedify",
|
|
14
11
|
"utils",
|
|
15
12
|
"docloader"
|
|
@@ -29,29 +26,26 @@ function getAuthenticatedDocumentLoader(identity, { allowPrivateAddress, userAge
|
|
|
29
26
|
require_http.validateCryptoKey(identity.privateKey);
|
|
30
27
|
async function load(url, options) {
|
|
31
28
|
if (!allowPrivateAddress) try {
|
|
32
|
-
await (0,
|
|
29
|
+
await (0, _fedify_vocab_runtime.validatePublicUrl)(url);
|
|
33
30
|
} catch (error) {
|
|
34
|
-
if (error instanceof
|
|
31
|
+
if (error instanceof _fedify_vocab_runtime.UrlError) logger$1.error("Disallowed private URL: {url}", {
|
|
35
32
|
url,
|
|
36
33
|
error
|
|
37
34
|
});
|
|
38
35
|
throw error;
|
|
39
36
|
}
|
|
40
|
-
|
|
41
|
-
const response = await require_http.doubleKnock(originalRequest, identity, {
|
|
37
|
+
return (0, _fedify_vocab_runtime.getRemoteDocument)(url, await require_http.doubleKnock((0, _fedify_vocab_runtime.createActivityPubRequest)(url, { userAgent }), identity, {
|
|
42
38
|
specDeterminer,
|
|
43
|
-
log: (0, es_toolkit.curry)(
|
|
39
|
+
log: (0, es_toolkit.curry)(_fedify_vocab_runtime.logRequest)(logger$1),
|
|
44
40
|
tracerProvider,
|
|
45
41
|
signal: options?.signal
|
|
46
|
-
});
|
|
47
|
-
return (0, __fedify_vocab_runtime.getRemoteDocument)(url, response, load);
|
|
42
|
+
}), load);
|
|
48
43
|
}
|
|
49
44
|
return load;
|
|
50
45
|
}
|
|
51
|
-
|
|
52
46
|
//#endregion
|
|
53
47
|
//#region src/utils/kv-cache.ts
|
|
54
|
-
const logger = (0,
|
|
48
|
+
const logger = (0, _logtape_logtape.getLogger)([
|
|
55
49
|
"fedify",
|
|
56
50
|
"utils",
|
|
57
51
|
"kv-cache"
|
|
@@ -66,11 +60,11 @@ function kvCache({ loader, kv, prefix, rules }) {
|
|
|
66
60
|
rules ??= [[new URLPattern({}), Temporal.Duration.from({ minutes: 5 })]];
|
|
67
61
|
for (const [p, duration] of rules) if (Temporal.Duration.compare(duration, { days: 30 }) > 0) throw new TypeError("The maximum cache duration is 30 days: " + (p instanceof URLPattern ? `${p.protocol}://${p.username}:${p.password}@${p.hostname}:${p.port}/${p.pathname}?${p.search}#${p.hash}` : p.toString()));
|
|
68
62
|
return async (url, options) => {
|
|
69
|
-
if (url in
|
|
63
|
+
if (url in _fedify_vocab_runtime.preloadedContexts) {
|
|
70
64
|
logger.debug("Using preloaded context: {url}.", { url });
|
|
71
65
|
return {
|
|
72
66
|
contextUrl: null,
|
|
73
|
-
document:
|
|
67
|
+
document: _fedify_vocab_runtime.preloadedContexts[url],
|
|
74
68
|
documentUrl: url
|
|
75
69
|
};
|
|
76
70
|
}
|
|
@@ -116,17 +110,16 @@ function matchRule(url, rules) {
|
|
|
116
110
|
}
|
|
117
111
|
return null;
|
|
118
112
|
}
|
|
119
|
-
|
|
120
113
|
//#endregion
|
|
121
|
-
Object.defineProperty(exports,
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
114
|
+
Object.defineProperty(exports, "getAuthenticatedDocumentLoader", {
|
|
115
|
+
enumerable: true,
|
|
116
|
+
get: function() {
|
|
117
|
+
return getAuthenticatedDocumentLoader;
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
Object.defineProperty(exports, "kvCache", {
|
|
121
|
+
enumerable: true,
|
|
122
|
+
get: function() {
|
|
123
|
+
return kvCache;
|
|
124
|
+
}
|
|
126
125
|
});
|
|
127
|
-
Object.defineProperty(exports, 'kvCache', {
|
|
128
|
-
enumerable: true,
|
|
129
|
-
get: function () {
|
|
130
|
-
return kvCache;
|
|
131
|
-
}
|
|
132
|
-
});
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
globalThis.addEventListener = () => {};
|
|
5
|
-
|
|
1
|
+
import { Temporal } from "@js-temporal/polyfill";
|
|
2
|
+
import "urlpattern-polyfill";
|
|
3
|
+
globalThis.addEventListener = () => {};
|
|
6
4
|
import { isEqual } from "es-toolkit";
|
|
7
|
-
|
|
8
5
|
//#region src/federation/kv.ts
|
|
9
6
|
/**
|
|
10
7
|
* A key–value store that stores values in memory.
|
|
@@ -57,8 +54,8 @@ var MemoryKvStore = class {
|
|
|
57
54
|
let currentValue;
|
|
58
55
|
if (entry == null) currentValue = void 0;
|
|
59
56
|
else {
|
|
60
|
-
const [value, expiration
|
|
61
|
-
if (expiration
|
|
57
|
+
const [value, expiration] = entry;
|
|
58
|
+
if (expiration != null && Temporal.Now.instant().until(expiration).sign < 0) {
|
|
62
59
|
delete this.#values[encodedKey];
|
|
63
60
|
currentValue = void 0;
|
|
64
61
|
} else currentValue = value;
|
|
@@ -91,6 +88,5 @@ var MemoryKvStore = class {
|
|
|
91
88
|
}
|
|
92
89
|
}
|
|
93
90
|
};
|
|
94
|
-
|
|
95
91
|
//#endregion
|
|
96
|
-
export { MemoryKvStore };
|
|
92
|
+
export { MemoryKvStore as t };
|
|
@@ -1,18 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
import { deno_default } from "./deno-DH972JvX.js";
|
|
7
|
-
import { fetchKey, validateCryptoKey } from "./key-CypuWa94.js";
|
|
1
|
+
import "@js-temporal/polyfill";
|
|
2
|
+
import "urlpattern-polyfill";
|
|
3
|
+
globalThis.addEventListener = () => {};
|
|
4
|
+
import { n as version, t as name } from "./deno-D5r_9RvZ.mjs";
|
|
5
|
+
import { n as fetchKey, o as validateCryptoKey } from "./key-D9Np_ZXl.mjs";
|
|
8
6
|
import { Activity, CryptographicKey, Object as Object$1, getTypeId } from "@fedify/vocab";
|
|
7
|
+
import { SpanStatusCode, trace } from "@opentelemetry/api";
|
|
9
8
|
import { getDocumentLoader } from "@fedify/vocab-runtime";
|
|
10
9
|
import { getLogger } from "@logtape/logtape";
|
|
11
|
-
import { SpanStatusCode, trace } from "@opentelemetry/api";
|
|
12
10
|
import { decodeBase64, encodeBase64 } from "byte-encodings/base64";
|
|
13
11
|
import { encodeHex } from "byte-encodings/hex";
|
|
14
12
|
import jsonld from "@fedify/vocab-runtime/jsonld";
|
|
15
|
-
|
|
16
13
|
//#region src/sig/ld.ts
|
|
17
14
|
const logger = getLogger([
|
|
18
15
|
"fedify",
|
|
@@ -54,11 +51,8 @@ async function createSignature(jsonLd, privateKey, keyId, { contextLoader, creat
|
|
|
54
51
|
creator: keyId.href,
|
|
55
52
|
created: created?.toString() ?? (/* @__PURE__ */ new Date()).toISOString()
|
|
56
53
|
};
|
|
57
|
-
const
|
|
58
|
-
const
|
|
59
|
-
const message = optionsHash + docHash;
|
|
60
|
-
const encoder = new TextEncoder();
|
|
61
|
-
const messageBytes = encoder.encode(message);
|
|
54
|
+
const message = await hashJsonLd(options, contextLoader) + await hashJsonLd(jsonLd, contextLoader);
|
|
55
|
+
const messageBytes = new TextEncoder().encode(message);
|
|
62
56
|
const signature = await crypto.subtle.sign("RSASSA-PKCS1-v1_5", privateKey, messageBytes);
|
|
63
57
|
return {
|
|
64
58
|
...options,
|
|
@@ -80,9 +74,7 @@ async function createSignature(jsonLd, privateKey, keyId, { contextLoader, creat
|
|
|
80
74
|
* @since 1.0.0
|
|
81
75
|
*/
|
|
82
76
|
async function signJsonLd(jsonLd, privateKey, keyId, options) {
|
|
83
|
-
|
|
84
|
-
const tracer = tracerProvider.getTracer(deno_default.name, deno_default.version);
|
|
85
|
-
return await tracer.startActiveSpan("ld_signatures.sign", { attributes: { "ld_signatures.key_id": keyId.href } }, async (span) => {
|
|
77
|
+
return await (options.tracerProvider ?? trace.getTracerProvider()).getTracer(name, version).startActiveSpan("ld_signatures.sign", { attributes: { "ld_signatures.key_id": keyId.href } }, async (span) => {
|
|
86
78
|
try {
|
|
87
79
|
const signature = await createSignature(jsonLd, privateKey, keyId, options);
|
|
88
80
|
if (span.isRecording()) {
|
|
@@ -184,23 +176,21 @@ async function verifySignature(jsonLd, options = {}) {
|
|
|
184
176
|
const encoder = new TextEncoder();
|
|
185
177
|
const message = sigOptsHash + docHash;
|
|
186
178
|
const messageBytes = encoder.encode(message);
|
|
187
|
-
|
|
188
|
-
if (verified) return key;
|
|
179
|
+
if (await crypto.subtle.verify("RSASSA-PKCS1-v1_5", key.publicKey, signature.slice(), messageBytes)) return key;
|
|
189
180
|
if (cached) {
|
|
190
181
|
logger.debug("Failed to verify with the cached key {keyId}; signature {signatureValue} is invalid. Retrying with the freshly fetched key...", {
|
|
191
182
|
keyId: sig.creator,
|
|
192
183
|
...sig
|
|
193
184
|
});
|
|
194
|
-
const { key
|
|
185
|
+
const { key } = await fetchKey(new URL(sig.creator), CryptographicKey, {
|
|
195
186
|
...options,
|
|
196
187
|
keyCache: {
|
|
197
188
|
get: () => Promise.resolve(void 0),
|
|
198
|
-
set: async (keyId, key
|
|
189
|
+
set: async (keyId, key) => await options.keyCache?.set(keyId, key)
|
|
199
190
|
}
|
|
200
191
|
});
|
|
201
|
-
if (key
|
|
202
|
-
|
|
203
|
-
return verified$1 ? key$1 : null;
|
|
192
|
+
if (key == null) return null;
|
|
193
|
+
return await crypto.subtle.verify("RSASSA-PKCS1-v1_5", key.publicKey, signature.slice(), messageBytes) ? key : null;
|
|
204
194
|
}
|
|
205
195
|
logger.debug("Failed to verify with the fetched key {keyId}; signature {signatureValue} is invalid. Check if the key is correct or if the signed message is correct. The message to sign is:\n{message}", {
|
|
206
196
|
keyId: sig.creator,
|
|
@@ -219,9 +209,7 @@ async function verifySignature(jsonLd, options = {}) {
|
|
|
219
209
|
* @returns `true` if the document is authentic; `false` otherwise.
|
|
220
210
|
*/
|
|
221
211
|
async function verifyJsonLd(jsonLd, options = {}) {
|
|
222
|
-
|
|
223
|
-
const tracer = tracerProvider.getTracer(deno_default.name, deno_default.version);
|
|
224
|
-
return await tracer.startActiveSpan("ld_signatures.verify", async (span) => {
|
|
212
|
+
return await (options.tracerProvider ?? trace.getTracerProvider()).getTracer(name, version).startActiveSpan("ld_signatures.verify", async (span) => {
|
|
225
213
|
try {
|
|
226
214
|
const object = await Object$1.fromJsonLd(jsonLd, options);
|
|
227
215
|
if (object.id != null) span.setAttribute("activitypub.object.id", object.id.href);
|
|
@@ -262,9 +250,7 @@ async function hashJsonLd(jsonLd, contextLoader) {
|
|
|
262
250
|
documentLoader: contextLoader ?? getDocumentLoader()
|
|
263
251
|
});
|
|
264
252
|
const encoder = new TextEncoder();
|
|
265
|
-
|
|
266
|
-
return encodeHex(hash);
|
|
253
|
+
return encodeHex(await crypto.subtle.digest("SHA-256", encoder.encode(canon)));
|
|
267
254
|
}
|
|
268
|
-
|
|
269
255
|
//#endregion
|
|
270
|
-
export {
|
|
256
|
+
export { signJsonLd as a, hasSignature as i, createSignature as n, verifyJsonLd as o, detachSignature as r, verifySignature as s, attachSignature as t };
|