import * as plc from "@did-plc/server"; import { TestNetworkNoAppView, TestPds, TestPlc, mockNetworkUtilities } from "@atproto/dev-env"; import { DEV_PLC_ROTATION_KEY_HEX, DEV_RECOVERY_DID_KEY } from "./dev-network-state"; import { DevLexiconAuthority, ensureLexiconAuthorityAccount, getPublishedLexiconNsids, verifyPublishedLexicon, } from "./lexicon-authority"; const PLC_PORT = 2583; const PDS_PORT = 2584; const BOOTSTRAP_PDS_PORT = 2585; export type DevNetwork = TestNetworkNoAppView & { plcDb: plc.MockDatabase; }; /** Boot an ephemeral in-process PDS + PLC (no disk persistence). */ export async function createDevNetwork(): Promise { const db = plc.Database.mock(); const plcPort = PLC_PORT; const plcUrl = `http://localhost:${plcPort}`; const plcServer = plc.PlcServer.create({ db, port: plcPort }); await plcServer.start(); const testPlc = new TestPlc(plcUrl, plcPort, plcServer); const bootstrapPds = await TestPds.create({ didPlcUrl: plcUrl, port: BOOTSTRAP_PDS_PORT, inviteRequired: false, }); try { const profile = await DevLexiconAuthority.create(bootstrapPds); const lexiconAuthorityDid = profile.did; const pds = await TestPds.create({ didPlcUrl: plcUrl, port: PDS_PORT, plcRotationKeyK256PrivateKeyHex: DEV_PLC_ROTATION_KEY_HEX, recoveryDidKey: DEV_RECOVERY_DID_KEY, lexiconDidAuthority: lexiconAuthorityDid, }); mockNetworkUtilities(pds); await profile.migrateTo(pds); await profile.publishRecords(); const authorityAgent = await ensureLexiconAuthorityAccount(pds); for (const nsid of getPublishedLexiconNsids()) { await verifyPublishedLexicon(authorityAgent, nsid, lexiconAuthorityDid); } const network = new TestNetworkNoAppView(testPlc, pds) as DevNetwork; network.plcDb = db; console.log("Dev network: ephemeral (fresh PDS + PLC each boot)\n"); return network; } finally { await bootstrapPds.close(); } }