UNPKG

@fedify/fedify

Version:

An ActivityPub server framework

95 lines (94 loc) 4.45 kB
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 {};