PDS File Reorganization Implementation Plan#
For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
Goal: Reorganize pds.js into logical domain sections with box-style headers for improved readability.
Architecture: Reorder existing code into 12 logical domains without changing functionality. Add Unicode box-style section headers. Group related utilities that are currently scattered.
Tech Stack: JavaScript, JSDoc
Box Header Format#
All section headers use this format (80 chars wide):
// ╔══════════════════════════════════════════════════════════════════════════════╗
// ║ SECTION NAME ║
// ║ Brief description of what this section contains ║
// ╚══════════════════════════════════════════════════════════════════════════════╝
Task 1: Types & Constants Section#
Files:
- Modify:
src/pds.js(lines 17-84, plus scattered constants)
Step 1: Create the new section header and gather all types/constants
Move these items to the top (after the file header comment):
CBOR_FALSE,CBOR_TRUE,CBOR_NULL,CBOR_TAG_CID(from lines 19-24)CODEC_DAG_CBOR,CODEC_RAW(from lines 480-481)TID_CHARS,clockId,lastTimestamp(from lines 563-566)P256_N,P256_N_DIV_2(from lines 638-641)- All typedefs:
Env,BlockRow,RecordRow,CommitRow,SeqEventRow,BlobRow,JwtPayload
Add header:
// ╔══════════════════════════════════════════════════════════════════════════════╗
// ║ TYPES & CONSTANTS ║
// ║ Environment bindings, SQL row types, protocol constants ║
// ╚══════════════════════════════════════════════════════════════════════════════╝
Step 2: Run typecheck to verify no breakage
Run: npm run typecheck
Expected: 0 errors
Step 3: Commit
git add src/pds.js
git commit -m "refactor: consolidate types and constants section"
Task 2: Utilities Section#
Files:
- Modify:
src/pds.js
Step 1: Create utilities section after types/constants
Move these functions together:
errorResponse()(from line 92)bytesToHex()(from line 990)hexToBytes()(from line 1001)bytesToBigInt()(from line 647)bigIntToBytes()(from line 660)base32Encode()(from line 538)base32Decode()(from line 1237)base64UrlEncode()(from line 745)base64UrlDecode()(from line 759)varint()(from line 1211)
Add header:
// ╔══════════════════════════════════════════════════════════════════════════════╗
// ║ UTILITIES ║
// ║ Error responses, byte conversion, base encoding ║
// ╚══════════════════════════════════════════════════════════════════════════════╝
Step 2: Run typecheck
Run: npm run typecheck
Expected: 0 errors
Step 3: Commit
git add src/pds.js
git commit -m "refactor: consolidate utilities section"
Task 3: CBOR Encoding Section#
Files:
- Modify:
src/pds.js
Step 1: Create CBOR section
Keep together (already grouped, just add new header):
encodeHead()cborEncode()cborEncodeDagCbor()cborDecode()
Replace // === CBOR ENCODING === with:
// ╔══════════════════════════════════════════════════════════════════════════════╗
// ║ CBOR ENCODING ║
// ║ RFC 8949 CBOR and DAG-CBOR for content-addressed data ║
// ╚══════════════════════════════════════════════════════════════════════════════╝
Step 2: Run typecheck
Run: npm run typecheck
Expected: 0 errors
Step 3: Commit
git add src/pds.js
git commit -m "refactor: add CBOR encoding section header"
Task 4: Content Identifiers Section#
Files:
- Modify:
src/pds.js
Step 1: Create CID/TID section
Group together:
class CID(from line 238)createCidWithCodec()(from line 489)createCid()(from line 510)createBlobCid()(from line 519)cidToString()(from line 528)cidToBytes()(from line 1226)createTid()(from line 572)
Add header:
// ╔══════════════════════════════════════════════════════════════════════════════╗
// ║ CONTENT IDENTIFIERS ║
// ║ CIDs (content hashes) and TIDs (timestamp IDs) ║
// ╚══════════════════════════════════════════════════════════════════════════════╝
Step 2: Run typecheck
Run: npm run typecheck
Expected: 0 errors
Step 3: Commit
git add src/pds.js
git commit -m "refactor: consolidate content identifiers section"
Task 5: Cryptography Section#
Files:
- Modify:
src/pds.js
Step 1: Create cryptography section
Group together:
sha256()(from line 1016)importPrivateKey()(from line 606)generateKeyPair()(from line 705)compressPublicKey()(from line 728)sign()(from line 675)
Add header:
// ╔══════════════════════════════════════════════════════════════════════════════╗
// ║ CRYPTOGRAPHY ║
// ║ P-256 signing with low-S normalization, key management ║
// ╚══════════════════════════════════════════════════════════════════════════════╝
Step 2: Run typecheck
Run: npm run typecheck
Expected: 0 errors
Step 3: Commit
git add src/pds.js
git commit -m "refactor: create cryptography section"
Task 6: Authentication Section#
Files:
- Modify:
src/pds.js
Step 1: Create authentication section
Group together:
hmacSign()(from line 777)createAccessJwt()(from line 800)createRefreshJwt()(from line 829)verifyJwt()(from line 876)verifyAccessJwt()(from line 919)verifyRefreshJwt()(from line 931)createServiceJwt()(from line 952)
Add header:
// ╔══════════════════════════════════════════════════════════════════════════════╗
// ║ AUTHENTICATION ║
// ║ JWT creation/verification for sessions and service auth ║
// ╚══════════════════════════════════════════════════════════════════════════════╝
Step 2: Run typecheck
Run: npm run typecheck
Expected: 0 errors
Step 3: Commit
git add src/pds.js
git commit -m "refactor: create authentication section"
Task 7: Merkle Search Tree Section#
Files:
- Modify:
src/pds.js
Step 1: Update MST section header
Keep together (already grouped):
keyDepthCachegetKeyDepth()commonPrefixLen()class MST
Replace // === MERKLE SEARCH TREE === with:
// ╔══════════════════════════════════════════════════════════════════════════════╗
// ║ MERKLE SEARCH TREE ║
// ║ MST for ATProto repository structure ║
// ╚══════════════════════════════════════════════════════════════════════════════╝
Step 2: Run typecheck
Run: npm run typecheck
Expected: 0 errors
Step 3: Commit
git add src/pds.js
git commit -m "refactor: update MST section header"
Task 8: CAR Files Section#
Files:
- Modify:
src/pds.js
Step 1: Update CAR section
Keep only:
buildCarFile()
(Note: varint(), cidToBytes(), base32Decode() moved to earlier sections)
Replace // === CAR FILE BUILDER === with:
// ╔══════════════════════════════════════════════════════════════════════════════╗
// ║ CAR FILES ║
// ║ Content Addressable aRchive format for repo sync ║
// ╚══════════════════════════════════════════════════════════════════════════════╝
Step 2: Run typecheck
Run: npm run typecheck
Expected: 0 errors
Step 3: Commit
git add src/pds.js
git commit -m "refactor: update CAR files section"
Task 9: Blob Handling Section#
Files:
- Modify:
src/pds.js
Step 1: Create blob handling section
Group together:
sniffMimeType()(from line 105)findBlobRefs()(from line 181)CRAWL_NOTIFY_THRESHOLD,lastCrawlNotify(from lines 207-208)notifyCrawlers()(from line 214)
Add header:
// ╔══════════════════════════════════════════════════════════════════════════════╗
// ║ BLOB HANDLING ║
// ║ MIME detection, blob reference scanning, crawler notification ║
// ╚══════════════════════════════════════════════════════════════════════════════╝
Step 2: Run typecheck
Run: npm run typecheck
Expected: 0 errors
Step 3: Commit
git add src/pds.js
git commit -m "refactor: create blob handling section"
Task 10: Routing Section#
Files:
- Modify:
src/pds.js
Step 1: Add routing section header
Before RouteHandler callback typedef, add:
// ╔══════════════════════════════════════════════════════════════════════════════╗
// ║ ROUTING ║
// ║ XRPC endpoint definitions ║
// ╚══════════════════════════════════════════════════════════════════════════════╝
This section contains:
RouteHandler(callback typedef)Route(typedef)pdsRoutes
Step 2: Run typecheck
Run: npm run typecheck
Expected: 0 errors
Step 3: Commit
git add src/pds.js
git commit -m "refactor: add routing section header"
Task 11: Personal Data Server Section#
Files:
- Modify:
src/pds.js
Step 1: Add PDS class section header
Before class PersonalDataServer, add:
// ╔══════════════════════════════════════════════════════════════════════════════╗
// ║ PERSONAL DATA SERVER ║
// ║ Durable Object class implementing ATProto PDS ║
// ╚══════════════════════════════════════════════════════════════════════════════╝
Step 2: Run typecheck
Run: npm run typecheck
Expected: 0 errors
Step 3: Commit
git add src/pds.js
git commit -m "refactor: add PDS class section header"
Task 12: Workers Entry Point Section#
Files:
- Modify:
src/pds.js
Step 1: Add workers entry point section header
Before corsHeaders, add:
// ╔══════════════════════════════════════════════════════════════════════════════╗
// ║ WORKERS ENTRY POINT ║
// ║ Request handling, CORS, auth middleware ║
// ╚══════════════════════════════════════════════════════════════════════════════╝
This section contains:
corsHeadersaddCorsHeaders()getSubdomain()requireAuth()handleAuthenticatedBlobUpload()handleAuthenticatedRepoWrite()handleRequest()default export
Step 2: Run typecheck
Run: npm run typecheck
Expected: 0 errors
Step 3: Commit
git add src/pds.js
git commit -m "refactor: add workers entry point section header"
Task 13: Final Verification#
Step 1: Run full typecheck
Run: npm run typecheck
Expected: 0 errors
Step 2: Run tests
Run: npm test
Expected: All tests pass
Step 3: Run e2e tests if available
Run: npm run test:e2e
Expected: All tests pass
Step 4: Final commit if any cleanup needed
git add src/pds.js
git commit -m "refactor: complete pds.js reorganization with box headers"
Section Order Summary#
Final file structure (top to bottom):
- File header comment
- TYPES & CONSTANTS
- UTILITIES
- CBOR ENCODING
- CONTENT IDENTIFIERS
- CRYPTOGRAPHY
- AUTHENTICATION
- MERKLE SEARCH TREE
- CAR FILES
- BLOB HANDLING
- ROUTING
- PERSONAL DATA SERVER
- WORKERS ENTRY POINT