@fedify/fedify 2.1.26 → 2.1.28
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/{builder-9KbL1CoC.mjs → builder-CW1BrLbm.mjs} +3 -3
- package/dist/compat/transformers.test.mjs +2 -2
- package/dist/{deno-ChmEXNOv.mjs → deno-CJgU2mcr.mjs} +1 -1
- package/dist/{docloader-DEVImb5e.mjs → docloader-o3fCIlIa.mjs} +2 -2
- package/dist/federation/builder.test.mjs +2 -2
- package/dist/federation/collection.test.mjs +1 -1
- package/dist/federation/handler.test.mjs +7 -7
- package/dist/federation/idempotency.test.mjs +3 -3
- package/dist/federation/inbox.test.mjs +1 -1
- package/dist/federation/keycache.test.mjs +33 -2
- package/dist/federation/kv.test.mjs +1 -1
- package/dist/federation/middleware.test.mjs +7 -7
- package/dist/federation/mod.cjs +1 -1
- package/dist/federation/mod.js +1 -1
- package/dist/federation/send.test.mjs +3 -3
- package/dist/federation/temporal.test.mjs +1 -1
- package/dist/federation/webfinger.test.mjs +2 -2
- package/dist/{http-B_M80hBW.mjs → http-Dcj1ulAh.mjs} +2 -2
- package/dist/{http-CeK9QmL_.js → http-DtypHuuK.js} +104 -10
- package/dist/{http-BOH-uFLj.cjs → http-EEfKB8Qb.cjs} +103 -9
- package/dist/{inbox-B_O6TjZS.mjs → inbox-CVYVJI0M.mjs} +1 -1
- package/dist/{key-BJcK-1Av.mjs → key-DRLvwDTh.mjs} +104 -10
- package/dist/{keycache-CaO7wyQA.mjs → keycache-RFlZObU3.mjs} +23 -2
- package/dist/{kv-cache-BlOG31SS.cjs → kv-cache-BWVKAAmc.cjs} +1 -1
- package/dist/{kv-cache-CEJICY0R.js → kv-cache-CEJCaF4E.js} +1 -1
- package/dist/{ld-YAXn6sG8.mjs → ld-C5BZ98YK.mjs} +2 -2
- package/dist/{middleware-DmTWC5VG.mjs → middleware-CqQoREZ9.mjs} +1 -1
- package/dist/{middleware-dGW2gSDG.cjs → middleware-DZxmsbPB.cjs} +1 -1
- package/dist/{middleware-DHGVHIUj.cjs → middleware-Dw9sPiec.cjs} +26 -6
- package/dist/{middleware-Co_QOX9H.mjs → middleware-SSrXiJIV.mjs} +15 -15
- package/dist/{middleware-C-45wr85.js → middleware-wCgWm4Eh.js} +25 -5
- package/dist/mod.cjs +4 -4
- package/dist/mod.js +4 -4
- package/dist/nodeinfo/client.test.mjs +1 -1
- package/dist/nodeinfo/handler.test.mjs +2 -2
- package/dist/nodeinfo/types.test.mjs +1 -1
- package/dist/otel/exporter.test.mjs +1 -1
- package/dist/{owner-B3ZkY-Ov.mjs → owner-cPOoPvmr.mjs} +2 -2
- package/dist/{proof-DIGrz49z.mjs → proof-BTknCsN7.mjs} +2 -2
- package/dist/{proof-BeGIkK97.js → proof-DPU3poip.js} +1 -1
- package/dist/{proof-DzOl2GlQ.cjs → proof-De1y2j-e.cjs} +1 -1
- package/dist/{send-N2w1IwXT.mjs → send-DDuHNgHz.mjs} +2 -2
- package/dist/sig/http.test.mjs +62 -3
- package/dist/sig/key.test.mjs +198 -4
- package/dist/sig/ld.test.mjs +2 -2
- package/dist/sig/mod.cjs +2 -2
- package/dist/sig/mod.js +2 -2
- package/dist/sig/owner.test.mjs +1 -1
- package/dist/sig/proof.test.mjs +1 -1
- package/dist/{temporal-CpT0u5Mx.mjs → temporal-CxXY--ZL.mjs} +1 -1
- package/dist/utils/docloader.test.mjs +2 -2
- package/dist/utils/mod.cjs +1 -1
- package/dist/utils/mod.js +1 -1
- package/package.json +6 -6
- /package/dist/{client-DM72NZuk.mjs → client-CjDMsn4a.mjs} +0 -0
- /package/dist/{collection-ChgDTHLz.mjs → collection-BD6-SZ6O.mjs} +0 -0
- /package/dist/{kv-BrZHNugx.mjs → kv-HvthQAHr.mjs} +0 -0
- /package/dist/{types-C37hquWI.mjs → types-DCP0WLdt.mjs} +0 -0
package/dist/mod.cjs
CHANGED
|
@@ -4,11 +4,11 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
4
4
|
require("./chunk-DDcVe30Y.cjs");
|
|
5
5
|
const require_transformers = require("./transformers-NeAONrAq.cjs");
|
|
6
6
|
require("./compat/mod.cjs");
|
|
7
|
-
const require_http = require("./http-
|
|
8
|
-
const require_middleware = require("./middleware-
|
|
7
|
+
const require_http = require("./http-EEfKB8Qb.cjs");
|
|
8
|
+
const require_middleware = require("./middleware-Dw9sPiec.cjs");
|
|
9
9
|
const require_types = require("./types-DRPjmHVV.cjs");
|
|
10
|
-
const require_proof = require("./proof-
|
|
11
|
-
const require_kv_cache = require("./kv-cache-
|
|
10
|
+
const require_proof = require("./proof-De1y2j-e.cjs");
|
|
11
|
+
const require_kv_cache = require("./kv-cache-BWVKAAmc.cjs");
|
|
12
12
|
const require_federation_mod = require("./federation/mod.cjs");
|
|
13
13
|
require("./nodeinfo/mod.cjs");
|
|
14
14
|
require("./runtime/mod.cjs");
|
package/dist/mod.js
CHANGED
|
@@ -3,11 +3,11 @@ import { URLPattern } from "urlpattern-polyfill";
|
|
|
3
3
|
import "./chunk-CRNNMoPX.js";
|
|
4
4
|
import { n as autoIdAssigner, r as getDefaultActivityTransformers, t as actorDehydrator } from "./transformers-BGMIq1cs.js";
|
|
5
5
|
import "./compat/mod.js";
|
|
6
|
-
import { _ as validateAcceptSignature, a as verifyRequestDetailed, c as fetchKey, d as importJwk, g as parseAcceptSignature, h as fulfillAcceptSignature, i as verifyRequest, l as fetchKeyDetailed, m as formatAcceptSignature, o as exportJwk, r as signRequest, u as generateCryptoKeyPair } from "./http-
|
|
7
|
-
import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as Router, f as RouterError, i as SendActivityError, l as digest, o as respondWithObject, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as createFederationBuilder } from "./middleware-
|
|
6
|
+
import { _ as validateAcceptSignature, a as verifyRequestDetailed, c as fetchKey, d as importJwk, g as parseAcceptSignature, h as fulfillAcceptSignature, i as verifyRequest, l as fetchKeyDetailed, m as formatAcceptSignature, o as exportJwk, r as signRequest, u as generateCryptoKeyPair } from "./http-DtypHuuK.js";
|
|
7
|
+
import { a as createExponentialBackoffPolicy, c as buildCollectionSynchronizationHeader, d as Router, f as RouterError, i as SendActivityError, l as digest, o as respondWithObject, r as handleWebFinger, s as respondWithObjectIfAcceptable, t as createFederation, u as createFederationBuilder } from "./middleware-wCgWm4Eh.js";
|
|
8
8
|
import { n as getNodeInfo, r as parseNodeInfo, t as nodeInfoToJson } from "./types-miAYfiGO.js";
|
|
9
|
-
import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "./proof-
|
|
10
|
-
import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-
|
|
9
|
+
import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "./proof-DPU3poip.js";
|
|
10
|
+
import { n as getAuthenticatedDocumentLoader, t as kvCache } from "./kv-cache-CEJCaF4E.js";
|
|
11
11
|
import { InProcessMessageQueue, MemoryKvStore, ParallelMessageQueue } from "./federation/mod.js";
|
|
12
12
|
import "./nodeinfo/mod.js";
|
|
13
13
|
import "./runtime/mod.js";
|
|
@@ -5,7 +5,7 @@ import { t as esm_default } from "../esm-DVILvP5e.mjs";
|
|
|
5
5
|
import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
|
|
6
6
|
import "../std__assert-BUOJXi-Z.mjs";
|
|
7
7
|
import { n as assertInstanceOf } from "../assert-BhQd8QHP.mjs";
|
|
8
|
-
import { a as parseProtocol, c as parseUsage, i as parseOutboundService, n as parseInboundService, o as parseServices, r as parseNodeInfo, s as parseSoftware, t as getNodeInfo } from "../client-
|
|
8
|
+
import { a as parseProtocol, c as parseUsage, i as parseOutboundService, n as parseInboundService, o as parseServices, r as parseNodeInfo, s as parseSoftware, t as getNodeInfo } from "../client-CjDMsn4a.mjs";
|
|
9
9
|
import { test } from "@fedify/fixture";
|
|
10
10
|
import { UrlError } from "@fedify/vocab-runtime";
|
|
11
11
|
import { configure, reset } from "@logtape/logtape";
|
|
@@ -4,8 +4,8 @@ globalThis.addEventListener = () => {};
|
|
|
4
4
|
import { n as createRequestContext } from "../context-Juj6bdHC.mjs";
|
|
5
5
|
import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
|
|
6
6
|
import "../std__assert-BUOJXi-Z.mjs";
|
|
7
|
-
import { t as MemoryKvStore } from "../kv-
|
|
8
|
-
import { a as createFederation, h as handleNodeInfoJrd, m as handleNodeInfo } from "../middleware-
|
|
7
|
+
import { t as MemoryKvStore } from "../kv-HvthQAHr.mjs";
|
|
8
|
+
import { a as createFederation, h as handleNodeInfoJrd, m as handleNodeInfo } from "../middleware-SSrXiJIV.mjs";
|
|
9
9
|
import { test } from "@fedify/fixture";
|
|
10
10
|
//#region src/nodeinfo/handler.test.ts
|
|
11
11
|
test("handleNodeInfo()", async () => {
|
|
@@ -4,7 +4,7 @@ globalThis.addEventListener = () => {};
|
|
|
4
4
|
import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
|
|
5
5
|
import "../std__assert-BUOJXi-Z.mjs";
|
|
6
6
|
import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
|
|
7
|
-
import { t as nodeInfoToJson } from "../types-
|
|
7
|
+
import { t as nodeInfoToJson } from "../types-DCP0WLdt.mjs";
|
|
8
8
|
import { test } from "@fedify/fixture";
|
|
9
9
|
//#region src/nodeinfo/types.test.ts
|
|
10
10
|
test("nodeInfoToJson()", () => {
|
|
@@ -3,7 +3,7 @@ import "urlpattern-polyfill";
|
|
|
3
3
|
globalThis.addEventListener = () => {};
|
|
4
4
|
import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
|
|
5
5
|
import "../std__assert-BUOJXi-Z.mjs";
|
|
6
|
-
import { t as MemoryKvStore } from "../kv-
|
|
6
|
+
import { t as MemoryKvStore } from "../kv-HvthQAHr.mjs";
|
|
7
7
|
import { test } from "@fedify/fixture";
|
|
8
8
|
import { SpanKind, SpanStatusCode, TraceFlags } from "@opentelemetry/api";
|
|
9
9
|
import { getLogger } from "@logtape/logtape";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "@js-temporal/polyfill";
|
|
2
2
|
import "urlpattern-polyfill";
|
|
3
3
|
globalThis.addEventListener = () => {};
|
|
4
|
-
import { n as version, t as name } from "./deno-
|
|
5
|
-
import { c as verifyKeyOwnership, n as fetchActorDocument, t as exportJwk } from "./key-
|
|
4
|
+
import { n as version, t as name } from "./deno-CJgU2mcr.mjs";
|
|
5
|
+
import { c as verifyKeyOwnership, n as fetchActorDocument, t as exportJwk } from "./key-DRLvwDTh.mjs";
|
|
6
6
|
import { CryptographicKey, Object as Object$1, isActor } from "@fedify/vocab";
|
|
7
7
|
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
8
8
|
import { getDocumentLoader } from "@fedify/vocab-runtime";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import "urlpattern-polyfill";
|
|
3
3
|
globalThis.addEventListener = () => {};
|
|
4
|
-
import { n as version, t as name } from "./deno-
|
|
5
|
-
import { r as fetchKey, s as validateCryptoKey } from "./key-
|
|
4
|
+
import { n as version, t as name } from "./deno-CJgU2mcr.mjs";
|
|
5
|
+
import { r as fetchKey, s as validateCryptoKey } from "./key-DRLvwDTh.mjs";
|
|
6
6
|
import { Activity, DataIntegrityProof, Multikey, getTypeId } from "@fedify/vocab";
|
|
7
7
|
import { SpanStatusCode, trace } from "@opentelemetry/api";
|
|
8
8
|
import { getLogger } from "@logtape/logtape";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import { URLPattern } from "urlpattern-polyfill";
|
|
3
|
-
import { c as fetchKey, f as validateCryptoKey, o as exportJwk, p as verifyKeyOwnership, s as fetchActorDocument, v as name, y as version } from "./http-
|
|
3
|
+
import { c as fetchKey, f as validateCryptoKey, o as exportJwk, p as verifyKeyOwnership, s as fetchActorDocument, v as name, y as version } from "./http-DtypHuuK.js";
|
|
4
4
|
import { getLogger } from "@logtape/logtape";
|
|
5
5
|
import { Activity, CryptographicKey, DataIntegrityProof, Multikey, Object as Object$1, getTypeId, isActor } from "@fedify/vocab";
|
|
6
6
|
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const { Temporal } = require("@js-temporal/polyfill");
|
|
2
2
|
const { URLPattern } = require("urlpattern-polyfill");
|
|
3
3
|
const require_chunk = require("./chunk-DDcVe30Y.cjs");
|
|
4
|
-
const require_http = require("./http-
|
|
4
|
+
const require_http = require("./http-EEfKB8Qb.cjs");
|
|
5
5
|
let _logtape_logtape = require("@logtape/logtape");
|
|
6
6
|
let _fedify_vocab = require("@fedify/vocab");
|
|
7
7
|
let _opentelemetry_api = require("@opentelemetry/api");
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "@js-temporal/polyfill";
|
|
2
2
|
import "urlpattern-polyfill";
|
|
3
3
|
globalThis.addEventListener = () => {};
|
|
4
|
-
import { n as version, t as name } from "./deno-
|
|
5
|
-
import { n as doubleKnock } from "./http-
|
|
4
|
+
import { n as version, t as name } from "./deno-CJgU2mcr.mjs";
|
|
5
|
+
import { n as doubleKnock } from "./http-Dcj1ulAh.mjs";
|
|
6
6
|
import { SpanKind, SpanStatusCode, trace } from "@opentelemetry/api";
|
|
7
7
|
import { FetchError, UrlError, validatePublicUrl } from "@fedify/vocab-runtime";
|
|
8
8
|
import { getLogger } from "@logtape/logtape";
|
package/dist/sig/http.test.mjs
CHANGED
|
@@ -7,11 +7,13 @@ import { i as assertExists, t as assertStringIncludes } from "../std__assert-BUO
|
|
|
7
7
|
import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
|
|
8
8
|
import { t as assert } from "../assert-BhQd8QHP.mjs";
|
|
9
9
|
import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
|
|
10
|
-
import { t as exportJwk } from "../key-
|
|
11
|
-
import { a as parseRfc9421Signature, c as timingSafeEqual, i as formatRfc9421SignatureParameters, l as verifyRequest, n as doubleKnock, o as parseRfc9421SignatureInput, r as formatRfc9421Signature, s as signRequest, t as createRfc9421SignatureBase, u as verifyRequestDetailed } from "../http-
|
|
10
|
+
import { t as exportJwk } from "../key-DRLvwDTh.mjs";
|
|
11
|
+
import { a as parseRfc9421Signature, c as timingSafeEqual, i as formatRfc9421SignatureParameters, l as verifyRequest, n as doubleKnock, o as parseRfc9421SignatureInput, r as formatRfc9421Signature, s as signRequest, t as createRfc9421SignatureBase, u as verifyRequestDetailed } from "../http-Dcj1ulAh.mjs";
|
|
12
12
|
import { i as rsaPrivateKey2, l as rsaPublicKey5, o as rsaPublicKey1, s as rsaPublicKey2 } from "../keys-CtZLJq76.mjs";
|
|
13
|
+
import { t as KvKeyCache } from "../keycache-RFlZObU3.mjs";
|
|
14
|
+
import { t as MemoryKvStore } from "../kv-HvthQAHr.mjs";
|
|
13
15
|
import { createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
|
|
14
|
-
import { FetchError, exportSpki } from "@fedify/vocab-runtime";
|
|
16
|
+
import { FetchError, UrlError, exportSpki } from "@fedify/vocab-runtime";
|
|
15
17
|
import { encodeBase64 } from "byte-encodings/base64";
|
|
16
18
|
//#region src/sig/http.test.ts
|
|
17
19
|
test("signRequest() [draft-cavage]", async () => {
|
|
@@ -230,6 +232,63 @@ test("verifyRequestDetailed() records failure details on span", async () => {
|
|
|
230
232
|
assertEquals(span.attributes["http_signatures.key_id"], keyId.href);
|
|
231
233
|
assertEquals(span.attributes["http_signatures.key_fetch_status"], 410);
|
|
232
234
|
});
|
|
235
|
+
test("verifyRequestDetailed() preserves cached key fetch errors", async (t) => {
|
|
236
|
+
const keyId = new URL("https://unreachable.example/actors/alice#main-key");
|
|
237
|
+
const timeout = new FetchError("https://unreachable.example/resolved-key", "Timed out after 100 ms");
|
|
238
|
+
timeout.cause = new DOMException("The operation timed out", "TimeoutError");
|
|
239
|
+
const failures = [
|
|
240
|
+
timeout,
|
|
241
|
+
new UrlError("DNS lookup failed", {
|
|
242
|
+
reason: "dns",
|
|
243
|
+
cause: /* @__PURE__ */ new TypeError("No usable IP addresses")
|
|
244
|
+
}),
|
|
245
|
+
new UrlError("Private IP address is not allowed")
|
|
246
|
+
];
|
|
247
|
+
for (const failure of failures) await t.step(failure.message, async () => {
|
|
248
|
+
const kv = new MemoryKvStore();
|
|
249
|
+
let fetches = 0;
|
|
250
|
+
const documentLoader = (url) => {
|
|
251
|
+
if (url === keyId.href) {
|
|
252
|
+
fetches++;
|
|
253
|
+
throw failure;
|
|
254
|
+
}
|
|
255
|
+
return mockDocumentLoader(url);
|
|
256
|
+
};
|
|
257
|
+
for (const cached of [false, true]) {
|
|
258
|
+
const result = await verifyRequestDetailed(await signRequest(new Request("https://example.com/inbox", {
|
|
259
|
+
method: "POST",
|
|
260
|
+
body: "Test activity"
|
|
261
|
+
}), rsaPrivateKey2, keyId), {
|
|
262
|
+
documentLoader,
|
|
263
|
+
contextLoader: mockDocumentLoader,
|
|
264
|
+
keyCache: new KvKeyCache(kv, ["pk"])
|
|
265
|
+
});
|
|
266
|
+
assertFalse(result.verified);
|
|
267
|
+
assert(result.reason.type === "keyFetchError");
|
|
268
|
+
assert("error" in result.reason.result);
|
|
269
|
+
const error = result.reason.result.error;
|
|
270
|
+
assertEquals(error.name, failure.name);
|
|
271
|
+
assertEquals(error.message, failure.message);
|
|
272
|
+
if (failure instanceof FetchError) {
|
|
273
|
+
assert(error instanceof FetchError);
|
|
274
|
+
assertEquals(error.url.href, failure.url.href);
|
|
275
|
+
assertEquals(error.response, void 0);
|
|
276
|
+
assert(error.cause instanceof DOMException);
|
|
277
|
+
assertEquals(error.cause.name, "TimeoutError");
|
|
278
|
+
assertEquals(error.cause.message, "The operation timed out");
|
|
279
|
+
} else {
|
|
280
|
+
assert(error instanceof UrlError);
|
|
281
|
+
assertEquals(error.reason, failure.reason);
|
|
282
|
+
if (failure.cause instanceof Error) {
|
|
283
|
+
assert(error.cause instanceof Error);
|
|
284
|
+
assertEquals(error.cause.name, failure.cause.name);
|
|
285
|
+
assertEquals(error.cause.message, failure.cause.message);
|
|
286
|
+
} else assertEquals(error.cause, void 0);
|
|
287
|
+
}
|
|
288
|
+
assertEquals(fetches, 1, cached ? "Cached failure was refetched" : "");
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
});
|
|
233
292
|
test("signRequest() and verifyRequest() [rfc9421] implementation", async () => {
|
|
234
293
|
const currentTimestamp = 1709626184;
|
|
235
294
|
const currentTime = Temporal.Instant.from("2024-03-05T08:09:44Z");
|
package/dist/sig/key.test.mjs
CHANGED
|
@@ -2,15 +2,16 @@ import "@js-temporal/polyfill";
|
|
|
2
2
|
import "urlpattern-polyfill";
|
|
3
3
|
globalThis.addEventListener = () => {};
|
|
4
4
|
import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
|
|
5
|
-
import "../std__assert-BUOJXi-Z.mjs";
|
|
5
|
+
import { n as assertStrictEquals } from "../std__assert-BUOJXi-Z.mjs";
|
|
6
6
|
import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
|
|
7
7
|
import { t as assert } from "../assert-BhQd8QHP.mjs";
|
|
8
8
|
import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
|
|
9
|
-
import { a as generateCryptoKeyPair, i as fetchKeyDetailed, o as importJwk, r as fetchKey, s as validateCryptoKey, t as exportJwk } from "../key-
|
|
9
|
+
import { a as generateCryptoKeyPair, i as fetchKeyDetailed, o as importJwk, r as fetchKey, s as validateCryptoKey, t as exportJwk } from "../key-DRLvwDTh.mjs";
|
|
10
10
|
import { c as rsaPublicKey3, i as rsaPrivateKey2, o as rsaPublicKey1, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CtZLJq76.mjs";
|
|
11
|
+
import { g as wrapContextLoaderForJsonLd } from "../ld-C5BZ98YK.mjs";
|
|
11
12
|
import { createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
|
|
12
|
-
import { CryptographicKey, Multikey } from "@fedify/vocab";
|
|
13
|
-
import { FetchError } from "@fedify/vocab-runtime";
|
|
13
|
+
import { CryptographicKey, Multikey, Person } from "@fedify/vocab";
|
|
14
|
+
import { FetchError, UrlError, getDocumentLoader } from "@fedify/vocab-runtime";
|
|
14
15
|
//#region src/sig/key.test.ts
|
|
15
16
|
test("validateCryptoKey()", async () => {
|
|
16
17
|
const pkcs1v15 = await crypto.subtle.generateKey({
|
|
@@ -399,6 +400,199 @@ test("fetchKey() returns null for a malformed actor publicKey", async () => {
|
|
|
399
400
|
cached: true
|
|
400
401
|
});
|
|
401
402
|
});
|
|
403
|
+
for (const cls of [CryptographicKey, Multikey]) for (const location of [
|
|
404
|
+
"actor",
|
|
405
|
+
"key",
|
|
406
|
+
"owner"
|
|
407
|
+
]) test(`fetchKey() handles JSON-LD context failures in ${cls.name} ${location} documents`, async (t) => {
|
|
408
|
+
const actorId = new URL("https://example.com/context-actor");
|
|
409
|
+
const keyId = new URL(`${actorId.href}#key`);
|
|
410
|
+
const key = cls === CryptographicKey ? rsaPublicKey1.clone({
|
|
411
|
+
id: keyId,
|
|
412
|
+
owner: actorId
|
|
413
|
+
}) : ed25519Multikey.clone({
|
|
414
|
+
id: keyId,
|
|
415
|
+
controller: actorId
|
|
416
|
+
});
|
|
417
|
+
const actorDocument = await new Person({
|
|
418
|
+
id: actorId,
|
|
419
|
+
...key instanceof CryptographicKey ? { publicKeys: [key] } : { assertionMethods: [key] }
|
|
420
|
+
}).toJsonLd({ contextLoader: mockDocumentLoader });
|
|
421
|
+
const keyDocument = await key.toJsonLd({ contextLoader: mockDocumentLoader });
|
|
422
|
+
const contextUrl = `https://example.com/context/${cls.name}/${location}`;
|
|
423
|
+
const transportErrors = [
|
|
424
|
+
/* @__PURE__ */ new TypeError("fetch failed"),
|
|
425
|
+
/* @__PURE__ */ new TypeError("error reading a body from connection"),
|
|
426
|
+
globalThis.Object.assign(/* @__PURE__ */ new TypeError("The socket connection was closed unexpectedly."), { code: "ECONNRESET" }),
|
|
427
|
+
globalThis.Object.assign(/* @__PURE__ */ new TypeError("Network request failed"), { code: "ECONNRESET" }),
|
|
428
|
+
new TypeError("Network request failed", { cause: globalThis.Object.assign(/* @__PURE__ */ new Error("connection refused"), { code: "ECONNREFUSED" }) }),
|
|
429
|
+
new FetchError(contextUrl, "HTTP 503"),
|
|
430
|
+
new FetchError(contextUrl, "HTTP 503", new Response("unavailable", { status: 503 })),
|
|
431
|
+
new UrlError("DNS lookup failed", { reason: "dns" }),
|
|
432
|
+
globalThis.Object.assign(/* @__PURE__ */ new Error("request aborted"), { name: "AbortError" })
|
|
433
|
+
];
|
|
434
|
+
const programmingErrors = [
|
|
435
|
+
/* @__PURE__ */ new Error("loader bug"),
|
|
436
|
+
/* @__PURE__ */ new ReferenceError("loader bug"),
|
|
437
|
+
/* @__PURE__ */ new TypeError("loader bug"),
|
|
438
|
+
"loader bug",
|
|
439
|
+
null,
|
|
440
|
+
void 0
|
|
441
|
+
];
|
|
442
|
+
const cases = [
|
|
443
|
+
{ kind: "inline" },
|
|
444
|
+
{
|
|
445
|
+
kind: "url",
|
|
446
|
+
wrapped: false
|
|
447
|
+
},
|
|
448
|
+
{
|
|
449
|
+
kind: "url",
|
|
450
|
+
wrapped: true
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
kind: "wrapped",
|
|
454
|
+
error: /* @__PURE__ */ new TypeError("Invalid URL string.")
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
kind: "remote",
|
|
458
|
+
document: 123
|
|
459
|
+
},
|
|
460
|
+
{
|
|
461
|
+
kind: "remote",
|
|
462
|
+
document: "not JSON"
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
kind: "remote",
|
|
466
|
+
document: { "@context": contextUrl }
|
|
467
|
+
},
|
|
468
|
+
...transportErrors.map((error) => ({
|
|
469
|
+
kind: "transport",
|
|
470
|
+
error
|
|
471
|
+
})),
|
|
472
|
+
...programmingErrors.map((error) => ({
|
|
473
|
+
kind: "programming",
|
|
474
|
+
error
|
|
475
|
+
})),
|
|
476
|
+
...location === "key" ? [{
|
|
477
|
+
kind: "transport",
|
|
478
|
+
error: /* @__PURE__ */ new TypeError("fetch failed"),
|
|
479
|
+
fallback: true
|
|
480
|
+
}, {
|
|
481
|
+
kind: "programming",
|
|
482
|
+
error: /* @__PURE__ */ new ReferenceError("fallback bug"),
|
|
483
|
+
fallback: true
|
|
484
|
+
}] : []
|
|
485
|
+
];
|
|
486
|
+
for (const scenario of cases) {
|
|
487
|
+
const description = "error" in scenario ? scenario.error instanceof Error ? `${scenario.error.name}: ${scenario.error.message}` : String(scenario.error) : "document" in scenario ? JSON.stringify(scenario.document) : "invalid type mapping";
|
|
488
|
+
await t.step(`${scenario.kind}: ${description}${"fallback" in scenario ? " (fallback)" : ""}`, async () => {
|
|
489
|
+
const cache = {};
|
|
490
|
+
let fetchError = { error: /* @__PURE__ */ new Error("stale fetch error") };
|
|
491
|
+
let recovered = false;
|
|
492
|
+
let contextLoads = 0;
|
|
493
|
+
const options = {
|
|
494
|
+
documentLoader(resource) {
|
|
495
|
+
const document = structuredClone(resource === keyId.href && location !== "actor" ? keyDocument : actorDocument);
|
|
496
|
+
if (location === "actor" || location === "key" && resource === keyId.href || location === "owner" && resource === actorId.href) {
|
|
497
|
+
const context = scenario.kind === "inline" ? { broken: {
|
|
498
|
+
"@id": "https://example.com/ns#broken",
|
|
499
|
+
"@type": "not-an-absolute-iri"
|
|
500
|
+
} } : scenario.kind === "url" ? "http://[" : contextUrl;
|
|
501
|
+
document["@context"] = [document["@context"], context].flat();
|
|
502
|
+
}
|
|
503
|
+
return Promise.resolve({
|
|
504
|
+
contextUrl: null,
|
|
505
|
+
documentUrl: resource,
|
|
506
|
+
document
|
|
507
|
+
});
|
|
508
|
+
},
|
|
509
|
+
async contextLoader(resource) {
|
|
510
|
+
if (scenario.kind === "url" && resource === "http://[") {
|
|
511
|
+
const loader = getDocumentLoader();
|
|
512
|
+
return await (scenario.wrapped ? wrapContextLoaderForJsonLd(loader) : loader)(resource);
|
|
513
|
+
}
|
|
514
|
+
if (scenario.kind === "wrapped" && resource === contextUrl) return await wrapContextLoaderForJsonLd(() => Promise.reject(scenario.error))(resource);
|
|
515
|
+
if (resource !== contextUrl) return await mockDocumentLoader(resource);
|
|
516
|
+
contextLoads++;
|
|
517
|
+
if (!recovered && "error" in scenario && (!("fallback" in scenario) || contextLoads > 1)) throw scenario.error;
|
|
518
|
+
return {
|
|
519
|
+
contextUrl: null,
|
|
520
|
+
documentUrl: resource,
|
|
521
|
+
document: !recovered && "document" in scenario ? scenario.document : { "@context": {} }
|
|
522
|
+
};
|
|
523
|
+
},
|
|
524
|
+
keyCache: {
|
|
525
|
+
get: (id) => Promise.resolve(cache[id.href]),
|
|
526
|
+
set(id, value) {
|
|
527
|
+
cache[id.href] = value;
|
|
528
|
+
return Promise.resolve();
|
|
529
|
+
},
|
|
530
|
+
getFetchError: () => Promise.resolve(fetchError),
|
|
531
|
+
setFetchError(_id, error) {
|
|
532
|
+
fetchError = error ?? void 0;
|
|
533
|
+
return Promise.resolve();
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
};
|
|
537
|
+
const lookup = () => fetchKey(keyId, cls, options);
|
|
538
|
+
if (scenario.kind === "programming" && "error" in scenario) {
|
|
539
|
+
assertStrictEquals(await assertRejects(lookup), scenario.error);
|
|
540
|
+
assertEquals(cache, {});
|
|
541
|
+
assertStrictEquals(await assertRejects(() => fetchKeyDetailed(keyId, cls, options)), scenario.error);
|
|
542
|
+
assertEquals(cache, {});
|
|
543
|
+
return;
|
|
544
|
+
}
|
|
545
|
+
assertEquals(await lookup(), {
|
|
546
|
+
key: null,
|
|
547
|
+
cached: false
|
|
548
|
+
});
|
|
549
|
+
assertEquals(cache, { [keyId.href]: null });
|
|
550
|
+
const detailed = await fetchKeyDetailed(keyId, cls, options);
|
|
551
|
+
assertEquals(detailed.cached, true);
|
|
552
|
+
if (scenario.kind === "transport" || scenario.kind === "wrapped") {
|
|
553
|
+
assert(detailed.fetchError != null);
|
|
554
|
+
if (scenario.error instanceof FetchError && scenario.error.response != null) {
|
|
555
|
+
assert("status" in detailed.fetchError);
|
|
556
|
+
assertEquals(detailed.fetchError.status, 503);
|
|
557
|
+
assertEquals(await detailed.fetchError.response.text(), "unavailable");
|
|
558
|
+
} else {
|
|
559
|
+
assert("error" in detailed.fetchError);
|
|
560
|
+
assertStrictEquals(detailed.fetchError.error, scenario.error);
|
|
561
|
+
}
|
|
562
|
+
} else assertEquals(detailed.fetchError, void 0);
|
|
563
|
+
const previousLoads = contextLoads;
|
|
564
|
+
assertEquals(await lookup(), {
|
|
565
|
+
key: null,
|
|
566
|
+
cached: true
|
|
567
|
+
});
|
|
568
|
+
assertEquals(contextLoads, previousLoads);
|
|
569
|
+
delete cache[keyId.href];
|
|
570
|
+
fetchError = void 0;
|
|
571
|
+
const fresh = await fetchKeyDetailed(keyId, cls, options);
|
|
572
|
+
assertEquals(fresh.cached, false);
|
|
573
|
+
assertEquals(fresh.key, null);
|
|
574
|
+
if (scenario.kind === "transport" || scenario.kind === "wrapped") {
|
|
575
|
+
assert(fresh.fetchError != null);
|
|
576
|
+
if (scenario.error instanceof FetchError && scenario.error.response != null) {
|
|
577
|
+
assert("status" in fresh.fetchError);
|
|
578
|
+
assertEquals(fresh.fetchError.status, 503);
|
|
579
|
+
assertEquals(await fresh.fetchError.response.text(), "unavailable");
|
|
580
|
+
} else {
|
|
581
|
+
assert("error" in fresh.fetchError);
|
|
582
|
+
assertStrictEquals(fresh.fetchError.error, scenario.error);
|
|
583
|
+
}
|
|
584
|
+
} else assertEquals(fresh.fetchError, void 0);
|
|
585
|
+
if (scenario.kind === "transport") {
|
|
586
|
+
delete cache[keyId.href];
|
|
587
|
+
recovered = true;
|
|
588
|
+
const result = await lookup();
|
|
589
|
+
assertEquals(result.cached, false);
|
|
590
|
+
assertEquals(result.key?.id, keyId);
|
|
591
|
+
assert(result.key?.publicKey != null);
|
|
592
|
+
}
|
|
593
|
+
});
|
|
594
|
+
}
|
|
595
|
+
});
|
|
402
596
|
test("fetchKey() rejects a key whose owner does not link back", async () => {
|
|
403
597
|
const keyId = "https://attacker.example/key";
|
|
404
598
|
const keyDocument = await rsaPublicKey1.toJsonLd({ contextLoader: mockDocumentLoader });
|
package/dist/sig/ld.test.mjs
CHANGED
|
@@ -5,9 +5,9 @@ import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
|
|
|
5
5
|
import { n as assertFalse, t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
|
|
6
6
|
import { n as assertInstanceOf, t as assert } from "../assert-BhQd8QHP.mjs";
|
|
7
7
|
import { t as assertThrows } from "../assert_throws-4NwKEy2q.mjs";
|
|
8
|
-
import { a as generateCryptoKeyPair } from "../key-
|
|
8
|
+
import { a as generateCryptoKeyPair } from "../key-DRLvwDTh.mjs";
|
|
9
9
|
import { a as rsaPrivateKey3, c as rsaPublicKey3, i as rsaPrivateKey2, n as ed25519PrivateKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CtZLJq76.mjs";
|
|
10
|
-
import { a as compactJsonLd, d as isInvalidUrlTypeError, f as signJsonLd, h as verifySignature, i as attachSignature, m as verifyJsonLd, n as UnsafeJsonLdError, o as createSignature, s as detachSignature } from "../ld-
|
|
10
|
+
import { a as compactJsonLd, d as isInvalidUrlTypeError, f as signJsonLd, h as verifySignature, i as attachSignature, m as verifyJsonLd, n as UnsafeJsonLdError, o as createSignature, s as detachSignature } from "../ld-C5BZ98YK.mjs";
|
|
11
11
|
import { mockDocumentLoader, test } from "@fedify/fixture";
|
|
12
12
|
import { CryptographicKey } from "@fedify/vocab";
|
|
13
13
|
import { encodeBase64 } from "byte-encodings/base64";
|
package/dist/sig/mod.cjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
const { Temporal } = require("@js-temporal/polyfill");
|
|
2
2
|
const { URLPattern } = require("urlpattern-polyfill");
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
4
|
-
const require_http = require("../http-
|
|
5
|
-
const require_proof = require("../proof-
|
|
4
|
+
const require_http = require("../http-EEfKB8Qb.cjs");
|
|
5
|
+
const require_proof = require("../proof-De1y2j-e.cjs");
|
|
6
6
|
exports.attachSignature = require_proof.attachSignature;
|
|
7
7
|
exports.createProof = require_proof.createProof;
|
|
8
8
|
exports.createSignature = require_proof.createSignature;
|
package/dist/sig/mod.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import { URLPattern } from "urlpattern-polyfill";
|
|
3
|
-
import { _ as validateAcceptSignature, a as verifyRequestDetailed, c as fetchKey, d as importJwk, g as parseAcceptSignature, h as fulfillAcceptSignature, i as verifyRequest, l as fetchKeyDetailed, m as formatAcceptSignature, o as exportJwk, r as signRequest, u as generateCryptoKeyPair } from "../http-
|
|
4
|
-
import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "../proof-
|
|
3
|
+
import { _ as validateAcceptSignature, a as verifyRequestDetailed, c as fetchKey, d as importJwk, g as parseAcceptSignature, h as fulfillAcceptSignature, i as verifyRequest, l as fetchKeyDetailed, m as formatAcceptSignature, o as exportJwk, r as signRequest, u as generateCryptoKeyPair } from "../http-DtypHuuK.js";
|
|
4
|
+
import { _ as signJsonLd, a as doesActorOwnKey, b as verifySignature, d as createSignature, f as detachSignature, i as verifyProof, l as attachSignature, n as signObject, o as getKeyOwner, r as verifyObject, t as createProof, y as verifyJsonLd } from "../proof-DPU3poip.js";
|
|
5
5
|
export { attachSignature, createProof, createSignature, detachSignature, doesActorOwnKey, exportJwk, fetchKey, fetchKeyDetailed, formatAcceptSignature, fulfillAcceptSignature, generateCryptoKeyPair, getKeyOwner, importJwk, parseAcceptSignature, signJsonLd, signObject, signRequest, validateAcceptSignature, verifyJsonLd, verifyObject, verifyProof, verifyRequest, verifyRequestDetailed, verifySignature };
|
package/dist/sig/owner.test.mjs
CHANGED
|
@@ -6,7 +6,7 @@ import "../std__assert-BUOJXi-Z.mjs";
|
|
|
6
6
|
import { n as assertFalse } from "../assert_rejects-B-qJtC9Z.mjs";
|
|
7
7
|
import { t as assert } from "../assert-BhQd8QHP.mjs";
|
|
8
8
|
import { o as rsaPublicKey1, s as rsaPublicKey2 } from "../keys-CtZLJq76.mjs";
|
|
9
|
-
import { n as getKeyOwner, t as doesActorOwnKey } from "../owner-
|
|
9
|
+
import { n as getKeyOwner, t as doesActorOwnKey } from "../owner-cPOoPvmr.mjs";
|
|
10
10
|
import { createTestTracerProvider, mockDocumentLoader, test } from "@fedify/fixture";
|
|
11
11
|
import { Create, CryptographicKey, lookupObject } from "@fedify/vocab";
|
|
12
12
|
//#region src/sig/owner.test.ts
|
package/dist/sig/proof.test.mjs
CHANGED
|
@@ -6,7 +6,7 @@ import "../std__assert-BUOJXi-Z.mjs";
|
|
|
6
6
|
import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
|
|
7
7
|
import { n as assertInstanceOf } from "../assert-BhQd8QHP.mjs";
|
|
8
8
|
import { i as rsaPrivateKey2, n as ed25519PrivateKey, r as ed25519PublicKey, s as rsaPublicKey2, t as ed25519Multikey } from "../keys-CtZLJq76.mjs";
|
|
9
|
-
import { i as verifyProof, n as signObject, r as verifyObject, t as createProof } from "../proof-
|
|
9
|
+
import { i as verifyProof, n as signObject, r as verifyObject, t as createProof } from "../proof-BTknCsN7.mjs";
|
|
10
10
|
import { mockDocumentLoader, test } from "@fedify/fixture";
|
|
11
11
|
import { Create, DataIntegrityProof, Multikey, Note, Place } from "@fedify/vocab";
|
|
12
12
|
import { decodeMultibase, importMultibaseKey } from "@fedify/vocab-runtime";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import "urlpattern-polyfill";
|
|
3
3
|
globalThis.addEventListener = () => {};
|
|
4
|
-
import { c as getNormalizationContextLoader } from "./ld-
|
|
4
|
+
import { c as getNormalizationContextLoader } from "./ld-C5BZ98YK.mjs";
|
|
5
5
|
import jsonld from "@fedify/vocab-runtime/jsonld";
|
|
6
6
|
//#region src/federation/temporal.ts
|
|
7
7
|
function isPlainObject(value) {
|
|
@@ -5,9 +5,9 @@ import { t as esm_default } from "../esm-DVILvP5e.mjs";
|
|
|
5
5
|
import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
|
|
6
6
|
import "../std__assert-BUOJXi-Z.mjs";
|
|
7
7
|
import { t as assertRejects } from "../assert_rejects-B-qJtC9Z.mjs";
|
|
8
|
-
import { l as verifyRequest } from "../http-
|
|
8
|
+
import { l as verifyRequest } from "../http-Dcj1ulAh.mjs";
|
|
9
9
|
import { i as rsaPrivateKey2 } from "../keys-CtZLJq76.mjs";
|
|
10
|
-
import { t as getAuthenticatedDocumentLoader } from "../docloader-
|
|
10
|
+
import { t as getAuthenticatedDocumentLoader } from "../docloader-o3fCIlIa.mjs";
|
|
11
11
|
import { mockDocumentLoader, test } from "@fedify/fixture";
|
|
12
12
|
import { FetchError, UrlError } from "@fedify/vocab-runtime";
|
|
13
13
|
import { configure, reset } from "@logtape/logtape";
|
package/dist/utils/mod.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const { Temporal } = require("@js-temporal/polyfill");
|
|
2
2
|
const { URLPattern } = require("urlpattern-polyfill");
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
4
|
-
const require_kv_cache = require("../kv-cache-
|
|
4
|
+
const require_kv_cache = require("../kv-cache-BWVKAAmc.cjs");
|
|
5
5
|
exports.getAuthenticatedDocumentLoader = require_kv_cache.getAuthenticatedDocumentLoader;
|
|
6
6
|
exports.kvCache = require_kv_cache.kvCache;
|
package/dist/utils/mod.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { Temporal } from "@js-temporal/polyfill";
|
|
2
2
|
import { URLPattern } from "urlpattern-polyfill";
|
|
3
|
-
import { n as getAuthenticatedDocumentLoader, t as kvCache } from "../kv-cache-
|
|
3
|
+
import { n as getAuthenticatedDocumentLoader, t as kvCache } from "../kv-cache-CEJCaF4E.js";
|
|
4
4
|
export { getAuthenticatedDocumentLoader, kvCache };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fedify/fedify",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.28",
|
|
4
4
|
"description": "An ActivityPub server framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ActivityPub",
|
|
@@ -144,9 +144,9 @@
|
|
|
144
144
|
"uri-template-router": "^1.0.0",
|
|
145
145
|
"url-template": "^3.1.1",
|
|
146
146
|
"urlpattern-polyfill": "^10.1.0",
|
|
147
|
-
"@fedify/vocab": "2.1.
|
|
148
|
-
"@fedify/webfinger": "2.1.
|
|
149
|
-
"@fedify/vocab-runtime": "2.1.
|
|
147
|
+
"@fedify/vocab": "2.1.28",
|
|
148
|
+
"@fedify/webfinger": "2.1.28",
|
|
149
|
+
"@fedify/vocab-runtime": "2.1.28"
|
|
150
150
|
},
|
|
151
151
|
"devDependencies": {
|
|
152
152
|
"@std/assert": "npm:@jsr/std__assert@^0.226.0",
|
|
@@ -158,8 +158,8 @@
|
|
|
158
158
|
"tsx": "^4.19.4",
|
|
159
159
|
"typescript": "^6.0.0",
|
|
160
160
|
"wrangler": "^4.17.0",
|
|
161
|
-
"@fedify/
|
|
162
|
-
"@fedify/
|
|
161
|
+
"@fedify/fixture": "2.0.0",
|
|
162
|
+
"@fedify/vocab-tools": "^2.1.28"
|
|
163
163
|
},
|
|
164
164
|
"scripts": {
|
|
165
165
|
"build:self": "tsdown",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|