OverviewFilesCommitsIssuesDocsReleasesPeers

atproto-room commits / 49c0802

serve-membrane: respond to list-blobs (org #32 slice 2)
THIS is the surface the keyless bridge talks to. hpp's serve-device.js keeps a separate responder list, and adding list-blobs only there gave the exact symptom you would expect and still find confusing: getBlob worked, listBlobs answered UNKNOWN_METHOD, and the deployed tree provably contained the handler. Public for the same reason get-blob is: it returns content addresses this peer already serves by CID. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
49c0802349c3194003e8e903ccc0b0d51d0c6ca5
by plankatron <fleeky@gmail.com> · 2026-08-07T02:37:03.000Z

Changed files (1) +11 -0

lib/serve-membrane.js +11 -0
……@@ -319,6 +319,17 @@ export async function serveMembrane (device, { corestore, swarm, did, handle, se
319319 // Blobs live in the PEER's BlobStore; the keyless bridge relays this RPC (peer-front.getBlob) and
320320 // streams the bytes back. null → the bridge answers 404. bytes are hex in the c.json RPC value.
321321 if (blobs) {
322 // list-blobs (com.atproto.sync.listBlobs) — PUBLIC, same reasoning as get-blob: it returns content
323 // addresses this peer already serves by CID, so it grants no access get-blob does not.
324 //
325 // ⛔ THIS SURFACE IS THE ONE THE BRIDGE TALKS TO. hpp's serve-device.js has a SEPARATE responder
326 // list, and adding the method only there produced exactly the confusing symptom you would expect:
327 // getBlob worked, listBlobs answered UNKNOWN_METHOD, and the deployed tree demonstrably contained
328 // the handler. Two surfaces, one patched. Keep them in step.
329 rpc.respond('list-blobs', async ({ limit, cursor } = {}) => {
330 if (typeof blobs.list !== 'function') return { cids: [], cursor: null, skipped: 'not-supported' }
331 return blobs.list({ limit, cursor })
332 })
322333 rpc.respond('get-blob', async ({ cid } = {}) => {
323334 if (!cid) return null
324335 const b = await blobs.get(String(cid))