@fedify/fedify
Version:
An ActivityPub server framework
95 lines (94 loc) • 4.45 kB
JavaScript
import { Temporal } from "@js-temporal/polyfill";
import "urlpattern-polyfill";
globalThis.addEventListener = () => {};
import { t as assertEquals } from "../assert_equals-Ew3jOFa3.mjs";
import { t as assertInstanceOf } from "../assert_instance_of-C4Ri6VuN.mjs";
import { t as assert } from "../assert-DikXweDx.mjs";
import { t as MemoryKvStore } from "../kv-rV3vodCc.mjs";
import { t as KvKeyCache } from "../keycache-EGATflN-.mjs";
import { test } from "@fedify/fixture";
import { CryptographicKey, Multikey } from "@fedify/vocab";
//#region src/federation/keycache.test.ts
test("KvKeyCache.set()", async () => {
const kv = new MemoryKvStore();
const cache = new KvKeyCache(kv, ["pk"]);
await cache.set(new URL("https://example.com/key"), new CryptographicKey({ id: new URL("https://example.com/key") }));
assertEquals(await kv.get(["pk", "https://example.com/key"]), {
"@context": "https://w3id.org/security/v1",
id: "https://example.com/key",
type: "CryptographicKey"
});
await cache.set(new URL("https://example.com/key2"), new Multikey({ id: new URL("https://example.com/key2") }));
assertEquals(await kv.get(["pk", "https://example.com/key2"]), {
"@context": "https://w3id.org/security/multikey/v1",
id: "https://example.com/key2",
type: "Multikey"
});
await cache.set(new URL("https://example.com/null"), null);
assert(cache.nullKeys.has("https://example.com/null"));
assertEquals(await kv.get(["pk", "https://example.com/null"]), null);
});
test("KvKeyCache.get()", async () => {
const kv = new MemoryKvStore();
const cache = new KvKeyCache(kv, ["pk"]);
await kv.set(["pk", "https://example.com/key"], {
"@context": "https://w3id.org/security/v1",
id: "https://example.com/key",
type: "CryptographicKey"
});
const cryptoKey = await cache.get(new URL("https://example.com/key"));
assertInstanceOf(cryptoKey, CryptographicKey);
assertEquals(cryptoKey?.id?.href, "https://example.com/key");
await kv.set(["pk", "https://example.com/key2"], {
"@context": "https://w3id.org/security/multikey/v1",
id: "https://example.com/key2",
type: "Multikey"
});
const multikey = await cache.get(new URL("https://example.com/key2"));
assertInstanceOf(multikey, Multikey);
assertEquals(multikey?.id?.href, "https://example.com/key2");
cache.nullKeys.set("https://example.com/null", Temporal.Now.instant().add(Temporal.Duration.from({ minutes: 10 })));
assertEquals(await cache.get(new URL("https://example.com/null")), null);
await kv.set(["pk", "https://example.com/null2"], null);
assertEquals(await new KvKeyCache(kv, ["pk"]).get(new URL("https://example.com/null2")), null);
});
test("KvKeyCache fetch error metadata", async () => {
const cache = new KvKeyCache(new MemoryKvStore(), ["pk"]);
const keyId = new URL("https://example.com/key");
await cache.setFetchError(keyId, {
status: 410,
response: new Response("gone", {
status: 410,
statusText: "Gone",
headers: { "content-type": "text/plain" }
})
});
const httpError = await cache.getFetchError(keyId);
assert(httpError != null && "status" in httpError);
if (httpError == null || !("status" in httpError)) throw new Error("Expected HTTP fetch error metadata.");
assertEquals(httpError.status, 410);
assertEquals(httpError.response.status, 410);
assertEquals(await httpError.response.text(), "gone");
await cache.setFetchError(keyId, { error: Object.assign(/* @__PURE__ */ new Error("boom"), { name: "TypeError" }) });
const nonHttpError = await cache.getFetchError(keyId);
assert(nonHttpError != null && "error" in nonHttpError);
if (nonHttpError == null || !("error" in nonHttpError)) throw new Error("Expected non-HTTP fetch error metadata.");
assertEquals(nonHttpError.error.name, "TypeError");
assertEquals(nonHttpError.error.message, "boom");
await cache.setFetchError(keyId, null);
assertEquals(await cache.getFetchError(keyId), void 0);
});
test("KvKeyCache unavailable entries expire", async () => {
const cache = new KvKeyCache(new MemoryKvStore(), ["pk"], { unavailableKeyTtl: Temporal.Duration.from({ milliseconds: 1 }) });
const keyId = new URL("https://example.com/expired");
await cache.set(keyId, null);
await cache.setFetchError(keyId, {
status: 410,
response: new Response(null, { status: 410 })
});
await new Promise((resolve) => setTimeout(resolve, 10));
assertEquals(await cache.get(keyId), void 0);
assertEquals(await cache.getFetchError(keyId), void 0);
});
//#endregion
export {};