decentralised message store

feat: serve did web

serenity 9a9778fe 1c04dd76

Changed files
+29 -9
src
lib
utils
routes
dot-well-known
did-dot-json
+18 -5
src/lib/utils/did.ts
···
-
import type {
-
DidDocument,
-
DidWeb,
-
VerificationMethod,
} from "@/lib/types/atproto";
import { Secp256k1PrivateKeyExportable } from "@atcute/crypto";
import { toString as uint8arraysToString } from "uint8arrays";
···
keys: ServiceKeys;
}
-
export const createDidWebDoc = async (
didWeb: DidWeb,
): Promise<CreateDidWebDocResult> => {
const atprotoKey = await Secp256k1PrivateKeyExportable.createKeypair();
···
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/multikey/v1",
],
id: didWeb,
verificationMethod,
···
serviceEndpoint: fragments[1] as string | undefined,
};
};
···
+
import { SERVICE_DID } from "@/lib/env";
+
import {
+
didWebSchema,
+
type DidDocument,
+
type DidWeb,
+
type VerificationMethod,
} from "@/lib/types/atproto";
import { Secp256k1PrivateKeyExportable } from "@atcute/crypto";
import { toString as uint8arraysToString } from "uint8arrays";
···
keys: ServiceKeys;
}
+
const buildDidWebDoc = async (
didWeb: DidWeb,
): Promise<CreateDidWebDocResult> => {
const atprotoKey = await Secp256k1PrivateKeyExportable.createKeypair();
···
"@context": [
"https://www.w3.org/ns/did/v1",
"https://w3id.org/security/multikey/v1",
+
"https://w3id.org/security/suites/secp256k1-2019/v1",
],
id: didWeb,
verificationMethod,
···
serviceEndpoint: fragments[1] as string | undefined,
};
};
+
+
const createDidWebDoc = async () => {
+
const did = SERVICE_DID;
+
const { success: isDidWeb, data: didWeb } = didWebSchema.safeParse(did);
+
if (!isDidWeb) return;
+
const { didDoc } = await buildDidWebDoc(didWeb);
+
return didDoc;
+
};
+
+
export const didDoc = await createDidWebDoc();
+9 -4
src/routes/dot-well-known/did-dot-json/route.ts
···
import type { Did } from "@/lib/types/atproto";
import { didDocumentSchema, didWebSchema } from "@/lib/types/atproto";
import type { Route, RouteHandler } from "@/lib/types/routes";
-
import { createDidWebDoc } from "@/lib/utils/did";
import { newErrorResponse } from "@/lib/utils/http/responses";
const routeHandlerFactory = (did: Did) => {
···
return Response.json(didDocument);
};
-
const { success: isDidWeb, data: didWeb } = didWebSchema.safeParse(did);
if (!isDidWeb) return serveDidPlc;
const serveDidDoc: RouteHandler = () => {
-
const didDoc = createDidWebDoc(didWeb);
-
return Response.json(didDoc);
};
···
import type { Did } from "@/lib/types/atproto";
import { didDocumentSchema, didWebSchema } from "@/lib/types/atproto";
import type { Route, RouteHandler } from "@/lib/types/routes";
+
import { didDoc as importedDidDoc } from "@/lib/utils/did";
import { newErrorResponse } from "@/lib/utils/http/responses";
const routeHandlerFactory = (did: Did) => {
···
return Response.json(didDocument);
};
+
const { success: isDidWeb } = didWebSchema.safeParse(did);
if (!isDidWeb) return serveDidPlc;
const serveDidDoc: RouteHandler = () => {
+
const didDoc = importedDidDoc;
+
if (!didDoc) {
+
return newErrorResponse(500, {
+
message:
+
"Somehow tried to serve a did:web document when no did:web document was available. Specifically, somehow parsing the same SERVICE_DID environment variable resulted in both a did:web and a not did:web",
+
});
+
}
return Response.json(didDoc);
};
+2
src/routes/index.ts
···
import type { Route, WsRoute } from "@/lib/types/routes";
import { indexRoute } from "@/routes/route";
export const routes: Record<string, Route | WsRoute> = {
"/": indexRoute,
};
···
import type { Route, WsRoute } from "@/lib/types/routes";
+
import { didWebDocRoute } from "@/routes/dot-well-known/did-dot-json/route";
import { indexRoute } from "@/routes/route";
export const routes: Record<string, Route | WsRoute> = {
"/": indexRoute,
+
"/.well-known/did.json": didWebDocRoute,
};