| … | … | @@ -1,6 +1,6 @@ |
| 1 | 1 | { |
| 2 | 2 | "name": "atproto-bridge", |
| 3 | "version": "0.9.42", | |
| 3 | "version": "0.9.43", | |
| 4 | 4 | "description": "Stateless keyless atproto MEMBRANE \u2014 fronts self-custody hyper-proto-peers to bluesky over HTTP/WS, holds no keys and never signs. Bare-runnable. Deploy root / flat closure over the identity+repo+store+pds packages.", |
| 5 | 5 | "type": "module", |
| 6 | 6 | "main": "index.js", |
| … | … | @@ -171,6 +171,22 @@ export function createPdsServer ({ peers = null, serverDid = null, availableUser |
| 171 | 171 | if (!front) return sendErr(res, 404, 'RepoNotFound', 'repo not fronted here') |
| 172 | 172 | return sendJson(res, 200, await front.getLatestCommit()) |
| 173 | 173 | } |
| 174 | // listBlobs: the DID's published blob INVENTORY, relayed from the peer. The referenced set can | |
| 175 | // be derived by walking records, so this exists for exactly one thing that cannot: an ORPHAN, | |
| 176 | // a blob uploaded and referenced by no record — the class that permanently lost the | |
| 177 | // 2026-07-03 image. `since` is accepted and NOT honoured (pointers carry no rev); saying so is | |
| 178 | // better than filtering wrongly, and it is reported in the response. | |
| 179 | case 'com.atproto.sync.listBlobs': { | |
| 180 | const front = await frontIfPeer(q.get('did')) | |
| 181 | if (!front) return notHere(res) | |
| 182 | if (typeof front.listBlobs !== 'function') return sendErr(res, 501, 'MethodNotImplemented', 'peer does not serve list-blobs') | |
| 183 | const r = await front.listBlobs({ limit: q.get('limit'), cursor: q.get('cursor') }) | |
| 184 | if (!r || r.skipped) return sendErr(res, 501, 'MethodNotImplemented', 'peer has no blob inventory') | |
| 185 | const body = { cids: r.cids || [] } | |
| 186 | if (r.cursor) body.cursor = r.cursor | |
| 187 | if (q.get('since')) body.sinceIgnored = true | |
| 188 | return sendJson(res, 200, body) | |
| 189 | } | |
| 174 | 190 | case 'com.atproto.sync.getRepo': { |
| 175 | 191 | const front = await frontIfPeer(q.get('did') || undefined) |
| 176 | 192 | if (!front) return sendErr(res, 404, 'RepoNotFound', 'repo not fronted here') |
| … | … | @@ -119,6 +119,22 @@ export function createPdsServer ({ peers = null, serverDid = null, availableUser |
| 119 | 119 | if (!front) return sendErr(res, 404, 'RepoNotFound', 'repo not fronted here') |
| 120 | 120 | return sendJson(res, 200, await front.getLatestCommit()) |
| 121 | 121 | } |
| 122 | // listBlobs: the DID's published blob INVENTORY, relayed from the peer. The referenced set can | |
| 123 | // be derived by walking records, so this exists for exactly one thing that cannot: an ORPHAN, | |
| 124 | // a blob uploaded and referenced by no record — the class that permanently lost the | |
| 125 | // 2026-07-03 image. `since` is accepted and NOT honoured (pointers carry no rev); saying so is | |
| 126 | // better than filtering wrongly, and it is reported in the response. | |
| 127 | case 'com.atproto.sync.listBlobs': { | |
| 128 | const front = await frontIfPeer(q.get('did')) | |
| 129 | if (!front) return notHere(res) | |
| 130 | if (typeof front.listBlobs !== 'function') return sendErr(res, 501, 'MethodNotImplemented', 'peer does not serve list-blobs') | |
| 131 | const r = await front.listBlobs({ limit: q.get('limit'), cursor: q.get('cursor') }) | |
| 132 | if (!r || r.skipped) return sendErr(res, 501, 'MethodNotImplemented', 'peer has no blob inventory') | |
| 133 | const body = { cids: r.cids || [] } | |
| 134 | if (r.cursor) body.cursor = r.cursor | |
| 135 | if (q.get('since')) body.sinceIgnored = true | |
| 136 | return sendJson(res, 200, body) | |
| 137 | } | |
| 122 | 138 | case 'com.atproto.sync.getRepo': { |
| 123 | 139 | const front = await frontIfPeer(q.get('did') || undefined) |
| 124 | 140 | if (!front) return sendErr(res, 404, 'RepoNotFound', 'repo not fronted here') |